2010-04-29 6 views
5

Ho un controller con due semplici metodi:Asp.Net MVC EditorTemplate modello viene perso dopo Messaggio

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

La visualizzazione delle informazioni dell'utente non è un problema. La vista rende perfettamente i dettagli dell'utente. Quando invio il modulo, l'utente dell'oggetto è perso. Ho eseguito il debug sulla riga "return View (User);" nel metodo Post Details, l'oggetto utente è pieno di valori nullable. Se non utilizzo il modello di editor, l'oggetto utente è pieno di dati corretti. Quindi ci deve essere qualcosa di sbagliato nel modello di editor, ma non riesco a capire di cosa si tratta. Suggerimenti?

+0

Confrontare il form inserito in entrambi i casi utilizzando Firebug o Fiddler. Sarà diverso Correggilo. –

risposta

1

Mi piacerebbe riprogettare un po ', cambiare l'editor di LabelTextBoxValidation in un helper Html e quindi creare un EditorTemplate per il 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.

EDIT: 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() 
      ); 
} 
+0

La riga Html.EditorFor (m => m) restituisce tutti i membri del modello, non è quello che voglio. Voglio solo rendere tre membri della classe utente. Ma il nuovo helper html sembra buono, grazie! :) – Colin

+0

Non se si definisce il proprio EditorTemplate in \ Views \ \ EditorTemplates \ – Tejs

+0

Tejs: Per fare ciò, sarebbe abbastanza facile: Potresti essere più chiaro su come creare un HtmlHelper? Sto cercando di crearne uno con una struttura del genere, ma non riesco a farlo. – Colin