2010-04-29 6 views
5

Ich habe einen Controller mit zwei einfachen Methoden:Asp.Net MVC EditorTemplate Modell ist nach Post verloren

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

Das Anzeigen von Benutzerinformationen ist kein Problem. Die Ansicht bietet eine perfekte Darstellung der Benutzerdetails. Wenn ich das Formular absende, ist der Objektbenutzer verloren. Ich debuggte in der Zeile "return View (User)"; In der Methode Post-Details wird das Benutzerobjekt mit Nullwerten gefüllt. Wenn ich die Editorvorlage nicht verwende, wird das Benutzerobjekt mit korrekten Daten gefüllt. Es muss also etwas mit der Editorvorlage nicht stimmen, aber ich kann nicht herausfinden, was es ist. Vorschläge?

+0

Vergleichen Sie die eingereichten Formular in beiden Fällen mit Firebug oder Fiddler. Es wird anders sein. Repariere das. –

Antwort

1

Ich würde ein wenig umbauen - Ändern Sie Ihren LabelTextBoxValidation-Editor zu einem HTML-Helfer, und erstellen Sie dann eine EditorTemplate für Ihr Datenmodell. So können Sie etwas tun könnten:

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

wo ValidatedTextBoxFor Ihr neuer HTML-Helfer ist:

<% 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 sein. 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); 
} 

, dass die Namen der Formularfelder festlegen sollte Recht wie ich glaube, als dass, wie die Quelle des Problems zu sein scheint.

EDIT: Hier ist der Code, die Ihnen helfen sollen:

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

Die Zeile Html.EditorFor (m => m) rendert alle Mitglieder des Modells, das ist nicht was ich will. Ich möchte nur drei Mitglieder der Benutzerklasse rendern. Aber der neue HTML-Helfer sieht gut aus, danke! :) – Colin

+0

Nicht, wenn Sie Ihre eigene EditorTemplate in \ Views \ \ EditorTemplates \ – Tejs

+0

Tejs definieren: Um das zu machen, wäre es ziemlich einfach: Könnten Sie klarer sein, wie man einen solchen HtmlHelper erstellt? Ich versuche, eine solche Struktur zu schaffen, aber ich versage es. – Colin