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?

È stato utile?

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()
           );
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top