modelbinding - ASP.NET MVC 2-Prefijo de ViewModel
data binding mvc (4)
En lugar de usar Html.RenderPartial
, podría usar plantillas de editor que manejarán prefijos.
Entonces en tu vista principal:
<div>
<%-- See below what does the second argument mean --%>
<%= Html.EditorFor(x => x.RegisterModel, "RegisterModel") %>
</div>
<div>
<%= Html.EditorFor(x => x.LoginModel, "LoginModel") %>
</div>
Y luego cree una carpeta Views/Shared/EditorTemplates/RegisterModel.ascx
(El nombre de este archivo se usa en el método EditorFor
helper). También tenga en cuenta que este parcial debe estar fuertemente tipado al tipo de la propiedad RegisterModel
:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Ns.Models.RegisterModel>" %>
<% using (Html.BeginForm("Register", "Member")) { %>
<fieldset>
<legend>Register</legend>
<p>
<%= Html.LabelFor(x => x.Nickname) %>
<%= Html.TextBoxFor(x => x.Nickname) %>
</p>
<p>
<%= Html.LabelFor(x => x.Email) %>
<%= Html.TextBoxFor(x => x.Email) %>
</p>
<p>
<%= Html.LabelFor(x => x.Password) %>
<%= Html.PasswordFor(x => x.Password) %>
</p>
<p>
<%= Html.LabelFor(x => x.PasswordRepeat) %>
<%= Html.PasswordFor(x => x.PasswordRepeat) %>
</p>
<input type="submit" value="Register" />
</fieldset>
<% } %>
Podría definir un parcial diferente para el modelo de inicio de sesión en Views/Shared/EditorTemplates/LoginModel.ascx
Quiero usar RenderPartial dos veces en mi vista con diferentes modelos asociados. El problema es que algunas propiedades están presentes en ambos modelos (apodo, contraseña). No tienen prefijo, por lo que incluso los id o los nombres son iguales en la salida. Ahora, si tengo errores de modelo para apodo o contraseña, ambos campos se resaltan.
Vista principal:
<div>
<% Html.RenderPartial("Register", Model.RegisterModel); %>
</div>
<div>
<% Html.RenderPartial("Login", Model.LoginModel); %>
</div>
Iniciar sesión Vista parcial:
<% using (Html.BeginForm("Login", "Member")) { %>
<fieldset>
<legend>Login</legend>
<p>
<%= Html.LabelFor(x => x.Nickname) %>
<%= Html.TextBoxFor(x => x.Nickname) %>
</p>
<p>
<%= Html.LabelFor(x => x.Password) %>
<%= Html.PasswordFor(x => x.Password) %>
</p>
<input type="submit" value="Login" />
</fieldset>
<% } %>
Registrarse Vista parcial:
<% using (Html.BeginForm("Register", "Member")) { %>
<fieldset>
<legend>Register</legend>
<p>
<%= Html.LabelFor(x => x.Nickname) %>
<%= Html.TextBoxFor(x => x.Nickname) %>
</p>
<p>
<%= Html.LabelFor(x => x.Email) %>
<%= Html.TextBoxFor(x => x.Email) %>
</p>
<p>
<%= Html.LabelFor(x => x.Password) %>
<%= Html.PasswordFor(x => x.Password) %>
</p>
<p>
<%= Html.LabelFor(x => x.PasswordRepeat) %>
<%= Html.PasswordFor(x => x.PasswordRepeat) %>
</p>
<input type="submit" value="Register" />
</fieldset>
<% } %>
¿Cómo puedo cambiar esto?
Parece que hay una sobrecarga para TextBoxFor que le permite especificar atributos HTML adicionales. No es una solución ideal, pero debería permitirle cambiar la identificación (¿y posiblemente el nombre?) De los cuadros de texto renderizados. Por supuesto, cambiar el nombre probablemente arruinaría las cosas cuando intentes publicar el formulario.
Si no puede hacer un EditorTemplate por alguna razón, puede hacer esto en su Vista:
var dataDict = new ViewDataDictionary();
dataDict.TemplateInfo.HtmlFieldPrefix = "myPrefixHere";
Html.RenderPartial("myPartialViewName", myPartialViewModel, dataDict);
Y he aquí, todas las entradas en su PartialView serán prefijadas.
Felicitaciones a R0MANARMY por señalar esto.
En primer lugar, puede usar Html.TextBox("input form name", ...)
y establecer el nombre a lo que desee. Hay un problema mayor, ¿cómo proporcionarías un prefijo en el nivel Html.RenderPartial()
? Ya está proporcionando una instancia modelo. Entonces, sin cambiar sus modelos de vista, solo hay una posibilidad más: escribir sus propias sobrecargas para RenderPartial()
que tomarían el prefijo y lo pasarían a otros.
Mira esto. Alguien ha escrito un montón de sobrecargas que permiten establecer prefijos. TextBoxFor renderizado a HTML con prefijo en el atributo ID
Si falta alguno, puede ver el patrón de cómo extender estos con los adicionales que pueda necesitar.