MVC 3 Razor @Html.ValidationMessageFor nicht teilweise laden per jquery.load()
Ich haben zusammen ein kleines Beispiel hier nur das problem zu replizieren.
Ich habe eine stark typisierte Teilansicht _Name.cshtml:
@model ValidationInPartial.ViewModels.MyViewModel
<h2>@ViewBag.Message</h2>
<fieldset>
<legend>Name</legend>
<div class="editor-label">
@Html.LabelFor(model => model.MyName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.MyName)
@Html.ValidationMessageFor(model => model.MyName)
</div>
<a href="#" id="reload">Reload Name</a>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<script type="text/javascript">
$(document).ready(function () {
$("#reload").click(function () {
$("#divName").load("Home/NameReload");
});
});
</script>
zunächst geladen und angezeigt werden innerhalb der main-Index.cshtml
<div id="divForm">
@using (Html.BeginForm()) {
<div id="divName">
@Html.Partial("_Name")
</div>
}
</div>
Feld MyName erforderlich ist und die Validierung erfolgt über die Required-Attribut in MyViewModel
namespace ValidationInPartial.ViewModels
{
public class MyViewModel
{
[Required(ErrorMessage = "Please enter a Name.")]
public string MyName { get; set; }
}
}
Nachdem die Seite geladen ist das erste mal, wenn Sie klicken Sie auf die Schaltfläche "Erstellen" verlassen Sie das Feld leer, wird die Validierung der Meldung "Bitte einen Namen eingeben." zeigt neben dem Feld und das Feld selbst verwandelt sich rosa, das ist das erwartete Verhalten.
Jetzt durch Klick auf den "Reload-Name" link, das macht einen ajax-call (jquery.load(...)), die teilweise neu geladen wird, ist hier-controller-code:
public PartialViewResult NameReload()
{
MyViewModel myViewModel = new MyViewModel();
ViewBag.Message = "Name Reloaded";
return PartialView("_Name", myViewModel);
}
Dieser Zeit, wenn Sie auf die Schaltfläche Erstellen klicken, verlassen Sie das Feld leer, wird die Validierung der Nachricht nicht angezeigt wird neben dem Feld, auch wenn das Thema dreht sich rosa.
Es stellt sich heraus, dass beim erneuten öffnen der teilweisen @Html.ValidationMessageFor nicht Rendern der prüfungsmeldung als das erste mal.
Hier ist die jquery-Dateien, die ich benutze
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
Frage ich mich, ob das ein bug in der Art und Weise der Razor-engine rendert die @Html.ValidationMessageFor oder ist das ein problem mit jquery?
Irgendeine Idee warum dies passiert?
Ich habe auch irgendwo gelesen, dass der ajax-Aufruf, verliert alle Skripte für die Seite, in der Tat habe ich um alle javascript-code innerhalb der teilweise so, dass Sie gerendert werden können und wieder verwendet.
In der Zwischenzeit fand ich ein workaround, das ist manuell zu Rendern, in der teilweise, was angeblich erbracht @Html.ValidationMessageFor:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="MyName"></span>
Jedoch diese Problemumgehung bedeutet, dass, wenn wir ändern die Art der überprüfung oder auch nur die Validierung Nachricht in das Required-Attribut in das ViewModel, das müssen wir ändern diese hard-coded Stück html in der Ansicht.
InformationsquelleAutor der Frage Roberto D | 2011-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
@NickBork hat eine großartige Antwort hier. Der Schlüssel ist, dass ASP.NET's MVC-rendering-engine keine Ausgabe der Validierung Skript, wenn es nicht zu denken, dass es ist eine form. Das Beispiel hacks, die es kaufen, in einer form und dann die Auswahl ein innerer Abschnitt des HTML-von wurde zurückgegeben wurde, im wesentlichen werfen Sie die Hülle von der form entfernt.
Gibt es eine andere Methode, so dass Sie nur können Sie Ihre Ansicht:
Mit dieser Methode wird es eigentlich nicht-FORMULAR-code-Ausgabe, aber die Validierung von markup wird da sein.
Dank,
John
InformationsquelleAutor der Antwort John Fager
Validierung von markup (span-tags, benutzerdefinierte Attribute, etc) werden nicht dargestellt, es sei denn Ihre Felder enthalten sind, die innerhalb eines FORMULARS. Die Validierung plugin selbst funktioniert nicht mit Elementen außerhalb der form.
Wenn ASP.NET macht Ihren Seitlichem Blick auf die Steuerelemente nicht in einem Formular, und somit nicht die Elemente gerendert werden.
Wenn Sie laden Sie haben teilweise Inhalte, die Sie benötigen, um eine Analyse der HTML über einen jQuery-Selektor.
In meinem Beispiel unten habe ich eine TBODY Sie auf der übergeordneten Seite Anzeigen, die die Zeilen enthält. Wenn ich Bedarf können Sie weitere Zeilen hinzufügen, ich rufe eine Ansicht, die eine form, table, tbody und Sammlung von Zeilen.
Hinweis, dass ich mit einem jQuery-Selektor zum auswählen der Zeilen in der Ansicht/PartialView, die geladen werden mit AJAX:
Den rest der wrapper nur fügt die Zeilen von der AJAX-View/PartialView an die aufrufende Eltern
tbody
:Ein paar andere Noten, die nach dem validator-plugin ausgeführt wurde, auf eine form, es kann nicht wieder aufgerufen werden, ohne erneut hinzufügen (siehe jquery.überprüfen.unauffällig funktioniert nicht mit dynamischen injiziert Elemente)
Um dies zu beheben, habe ich zuerst rufen Sie die folgende Methode, um entfernen Sie alle Prüfungen:
Ich dann aktualisieren Sie die Prüfungen mit den folgenden:
InformationsquelleAutor der Antwort Nick Bork
Ich kann mich nicht erinnern, wo ich die Lösung gefunden. Der Grund ist, weil Sie das laden einer PartialView in einer Ansicht, die bereits analysiert, indem die jquery.validator.unauffällig Bibliothek. Sie müssen zu re-analysieren, die unauffällig Bibliothek
InformationsquelleAutor der Antwort Vincent