Asp.Net MVC EditorTemplate modello è perso dopo il POST
-
02-10-2019 - |
Domanda
Ho un controller con due semplici metodi:
UserController Metodi:
[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);
}
Poi c'è una semplice vista per la visualizzazione dei dettagli:
<% 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" />
<% } %>
Come si può vedere, io uso un editor di modelli "LabelTextBoxValidation":
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<%= Html.Label("") %>
<%= Html.TextBox(Model,Model)%>
<%= Html.ValidationMessage("")%>
Visualizzazione delle informazioni utente non è un problema. La vista rende perfettamente dati di utente. Quando ho inviato il modulo, l'utente oggetto è perduto. Ho il debug sulla riga "ritorno View (Utente);" nel metodo post dettagli, l'oggetto utente viene riempito con i valori Null. Se io non uso l'editor di modelli, l'oggetto utente viene riempito con i dati corretti. Quindi ci deve essere qualcosa di sbagliato con l'editor di modelli, ma non riesco a capire di cosa si tratta. Suggerimenti?
Soluzione
Vorrei ri-architetto un po '- cambiare il vostro editor LabelTextBoxValidation a un Html aiutante, e poi fare una EditorTemplate per il vostro modello di dati. In questo modo si potrebbe fare qualcosa di simile:
<% using (Html.BeginForm("Details", "User", FormMethod.Post))
{%>
<fieldset>
<legend>Userinfo</legend>
<% Html.EditorFor(m => m); %>
</fieldset>
<input type="submit" id="btnChange" value="Change" />
<% } %>
E il vostro editor di modelli sarebbe qualcosa di simile:
<%= Html.ValidatedTextBoxFor(m => m.Name); %>
<%= Html.ValidatedTextBoxFor(m => m.Email); %>
<%= Html.ValidatedTextBoxFor(m => m.Telephone); %>
dove ValidatedTextBoxFor è il tuo nuovo aiutante html. Per fare questo, sarebbe abbastanza facile:
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);
}
Questo dovrebbe impostare i nomi dei campi del modulo giusto credo, come che sembra come la fonte del problema.
Modifica : Ecco il codice che vi possono aiutare:
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()
);
}