Pregunta

Tengo un controlador con dos métodos simples:

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

A continuación, 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, yo uso un editor de plantillas "LabelTextBoxValidation":

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

Se muestra información de usuario no es ningún problema. La vista hace perfectamente detalles del usuario. Cuando envíe el formulario, se pierde el objeto de usuario. Me depurado en la fila "retorno Ver (usuario);" en el método Post Detalles, el objeto de usuario se llena con valores anulables. Si no utilizo el editor de plantillas, el objeto de usuario se llena con los datos correctos. Así que tiene que haber algo mal con el editor de plantillas, pero no se puede averiguar lo que es. Sugerencias?

¿Fue útil?

Solución

Me rediseñar un poco - cambiar su editor HTML LabelTextBoxValidation a un ayudante, y luego hacer una 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 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 la forma correcta en mi opinión, ya que parece como el origen del problema.

Editar : Este es el código que debería ayudar a salir:

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()
           );
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top