2010-04-29 6 views
5

Tengo un controlador con dos métodos simples:Asp.Net MVC Modelo EditorTemplate se pierde después del anuncio

UserController Métodos:

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

Entonces hay una visión simple para mostrar los detalles:

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

Como se puede ver, utilizar una "LabelTextBoxValidation" editor de plantillas:

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

Mostrar la información del usuario no es un problema. La vista representa perfectamente los detalles del usuario. Cuando envío el formulario, el usuario del objeto se pierde. Depuré en la fila "return View (User);" en el método Detalles de publicación, el objeto de usuario está lleno de valores que aceptan valores nulos. Si no uso la plantilla del editor, el objeto del usuario se llena con los datos correctos. Entonces tiene que haber algo mal con la plantilla del editor, pero no puede descifrar de qué se trata. Sugerencias?

+0

comparar el formulario presentado en ambos casos utilizando Firebug o Fiddler. Será diferente Arregla eso. –

Respuesta

1

Me gustaría volver a diseñar un poco - cambie su editor LabelTextBoxValidation a un helper Html, y luego haga un EditorTemplate para su modelo de datos. De esa manera se podría hacer algo como esto:

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

Y el editor de plantillas serían algo así como:

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

donde ValidatedTextBoxFor es su nueva ayuda HTML. Para hacer eso, sería bastante fácil:

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

Eso debería establecer los nombres de los campos de formulario correcto que creen, ya que parece como el origen del problema.

EDITAR: Este es el código que le ayudarán a cabo:

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 línea Html.EditorFor (m => m) representa todos los miembros del modelo, eso no es lo que quiero. Solo quiero renderizar tres miembros de la clase de usuario. Pero el nuevo helper html se ve bien, ¡gracias! :) – Colin

+0

No si defines tu propia EditorTemplate en \ Views \ \ EditorTemplates \ – Tejs

+0

Tejs: Para hacer eso, sería bastante fácil: ¿Podrías ser más claro sobre cómo crear dicho HtmlHelper? Intento crear uno con esa estructura, pero no lo hago. – Colin

Cuestiones relacionadas