2010-04-29 4 views
5

J'ai un contrôleur avec deux méthodes simples:Asp.Net MVC EditorTemplate modèle est perdu après post

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("")%> 

Affichage des informations de l'utilisateur n'est pas un problème. La vue rend parfaitement les détails de l'utilisateur. Lorsque je soumets le formulaire, l'utilisateur de l'objet est perdu. J'ai débogué sur la ligne "return View (User);" dans la méthode Post Details, l'objet utilisateur est rempli avec des valeurs nullables. Si je n'utilise pas le modèle d'éditeur, l'objet utilisateur est rempli avec les données correctes. Il doit donc y avoir quelque chose qui ne va pas avec le modèle de l'éditeur, mais ne peut pas comprendre ce que c'est. Suggestions?

+0

Comparer le formulaire présenté dans les deux cas en utilisant Firebug ou Fiddler. Ce sera différent. Répare ça. –

Répondre

1

Je voudrais ré-architecturer un peu - changez votre éditeur LabelTextBoxValidation en une aide HTML, puis créez 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 redresser les noms des champs de formulaire, 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() 
      ); 
} 
+0

La ligne Html.EditorFor (m => m) rend tous les membres du modèle, ce n'est pas ce que je veux. Je veux juste rendre trois membres de la classe d'utilisateurs. Mais le nouvel assistant html a l'air bien, merci! :) – Colin

+0

Pas si vous définissez votre propre EditorTemplate dans \ Views \ \ EditorTemplates \ – Tejs

+0

Tejs: Pour faire cela, ce serait assez facile: Pourriez-vous être plus clair sur la façon de créer un tel HtmlHelper? J'essaie d'en créer un avec une telle structure, mais je ne le fais pas. – Colin

Questions connexes