Question

J'ai un contrôleur avec deux méthodes simples:

UserController Méthodes:

[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);
}

Ensuite, il y a une vue simple pour afficher les détails:

<% 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" />
<% } %>

Comme vous pouvez le voir, j'utiliser un modèle d'éditeur "LabelTextBoxValidation":

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<%= Html.Label("") %>
<%= Html.TextBox(Model,Model)%>
<%= Html.ValidationMessage("")%>

Afficher les informations de l'utilisateur n'y a aucun problème. Le point de vue rend parfaitement les détails de l'utilisateur. Quand je soumets le formulaire, l'utilisateur de l'objet est perdu. Je débogués sur la ligne « return View (utilisateur); » dans la méthode Post Détails, l'objet utilisateur est rempli de valeurs nullables. Si je ne l'utilise le modèle de l'éditeur, l'objet utilisateur est rempli de données correctes. Donc, il doit y avoir quelque chose de mal avec le modèle de l'éditeur, mais ne peut pas comprendre ce qu'elle est. Suggestions?

Était-ce utile?

La solution

Je re architecte un peu - changer votre éditeur de LabelTextBoxValidation à une aide Html, puis faire un EditorTemplate pour votre modèle de données. De cette façon, vous pourriez faire quelque chose comme ceci:

<% using (Html.BeginForm("Details", "User", FormMethod.Post))
{%>
  <fieldset>
   <legend>Userinfo</legend>
   <% Html.EditorFor(m => m); %>
  </fieldset>
  <input type="submit" id="btnChange" value="Change" />
<% } %>

Et votre modèle d'éditeur serait quelque chose comme:

<%= Html.ValidatedTextBoxFor(m => m.Name); %>
<%= Html.ValidatedTextBoxFor(m => m.Email); %>
<%= Html.ValidatedTextBoxFor(m => m.Telephone); %>

où ValidatedTextBoxFor est votre nouvelle aide html. Pour cela, il serait assez 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);
}

Cela devrait définir les noms des champs de formulaire à droite je crois, comme cela semble être la source du problème.

EDIT : Voici le code qui devrait vous aider:

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()
           );
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top