Asp.Net MVC EditorTemplate Modell ist nach Post verloren
-
02-10-2019 - |
Frage
Ich habe einen Controller mit zwei einfachen Methoden:
Usercontroller Methoden:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Details(string id)
{
User user = UserRepo.UserByID(id);
return View(user);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Details(User user)
{
return View(user);
}
Dann gibt es eine einfache Ansicht, die die Details für die Anzeige:
<% using (Html.BeginForm("Details", "User", FormMethod.Post))
{%>
<fieldset>
<legend>Userinfo</legend>
<%= Html.EditorFor(m => m.Name, "LabelTextBoxValidation")%>
<%= Html.EditorFor(m => m.Email, "LabelTextBoxValidation")%>
<%= Html.EditorFor(m => m.Telephone, "LabelTextBoxValidation")%>
</fieldset>
<input type="submit" id="btnChange" value="Change" />
<% } %>
Wie Sie sehen können, verwende ich eine Editor-Vorlage "LabelTextBoxValidation":
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<%= Html.Label("") %>
<%= Html.TextBox(Model,Model)%>
<%= Html.ValidationMessage("")%>
Benutzerinformationen angezeigt ist kein Problem. Die Ansicht rendert perfekt Benutzerdaten. Wenn ich das Formular abzuschicken, wird das Objekt Benutzer verloren. Ich gedebuggt auf der Zeile „return View (Benutzer);“ in den Veröffentlichungsdetails Verfahren wird das Benutzerobjekt mit Nullable-Werten gefüllt. Wenn ich den Editor-Vorlage nicht verwenden, wird das Benutzerobjekt mit korrekten Daten gefüllt. So hat es etwas falsch mit der Editor-Vorlage sein, aber kann nicht herausfinden, was es ist. Vorschläge?
Lösung
Ich würde wieder Architekt ein wenig - Ihr LabelTextBoxValidation Editor ändern, um eine HTML-Helfer, und dann ein EditorTemplate für Ihr Datenmodell machen. So können Sie etwas tun könnte:
<% using (Html.BeginForm("Details", "User", FormMethod.Post))
{%>
<fieldset>
<legend>Userinfo</legend>
<% Html.EditorFor(m => m); %>
</fieldset>
<input type="submit" id="btnChange" value="Change" />
<% } %>
Und Ihre Editor-Vorlage wäre so etwas wie:
<%= Html.ValidatedTextBoxFor(m => m.Name); %>
<%= Html.ValidatedTextBoxFor(m => m.Email); %>
<%= Html.ValidatedTextBoxFor(m => m.Telephone); %>
wo ValidatedTextBoxFor ist Ihre neue HTML-Helfer. Um das zu erreichen, wäre es ziemlich einfach sein:
public static MvcHtmlString ValidatedTextBoxFor<T>(this HtmlHelper helper, Expression thingy)
{
// Some pseudo code, Visual Studio isn't in front of me right now
return helper.LabelFor(thingy) + helper.TextBoxFor(thingy) + helper.ValidationMessageFor(thingy);
}
Das sollte die Namen der Formularfelder gesetzt Recht wie ich glaube, als dass, wie die Quelle des Problems zu sein scheint.
Bearbeiten : Hier ist der Code, der Ihnen helfen soll:
public static MvcHtmlString ValidatedTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return MvcHtmlString.Create(
html.LabelFor(expression).ToString() +
html.TextBoxFor(expression).ToString() +
html.ValidationMessageFor(expression).ToString()
);
}