2010-03-18 24 views
12

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.ASP.NET MVC 2 - Prefijo de ViewModel

Vista principal:

<div> 
    <% Html.RenderPartial("Register", Model.RegisterModel); %> 
</div> 
<div> 
    <% Html.RenderPartial("Login", Model.LoginModel); %> 
</div> 

sesión PartialView:

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

Registro PartialView:

<% 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?

Respuesta

8

En lugar de usar Html.RenderPartial puede usar editor templates que manejará los prefijos.

Así que en su 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 crear una carpeta Views/Shared/EditorTemplates/RegisterModel.ascx (El nombre de este archivo se utiliza en el método de ayuda EditorFor). Observe también que esta parcial debe tener un tipo fuerte con el 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> 
<% } %> 

se podría definir un parcial diferente para el modelo de entrada en Views/Shared/EditorTemplates/LoginModel.ascx

0

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.

0

Antes que nada, 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 rendering to HTML with prefix on the ID attribute

Si falta alguno, puede ver el patrón de cómo ampliar estos con los adicionales que pueda necesitar.

+1

No necesita escribir su propia sobrecarga para RenderPartial, ya hay una sobrecarga que le permite redefinir qué es la colección ViewData. Simplemente puede agregar su prefijo y hacer que su modelo lo busque. Ver: http://msdn.microsoft.com/en-us/library/dd470827.aspx – R0MANARMY

12

Si no se puede hacer una EditorTemplate para algunos razón, usted puede hacer esto en su Vista:

var dataDict = new ViewDataDictionary(); 
dataDict.TemplateInfo.HtmlFieldPrefix = "myPrefixHere"; 
Html.RenderPartial("myPartialViewName", myPartialViewModel, dataDict); 

hete aquí que llevarán el prefijo todas las entradas en su PartialView.

Felicitaciones a R0MANARMY por señalar esto.

+2

y como un trazador de líneas: Html.RenderPartial ("myPartialViewName", myPartialViewModel, new ViewDataDictionary() {TemplateInfo = new TemplateInfo() {HtmlFieldPrefix = "myPrefixHere"}}) –

+0

Eso es genial, gracias – karaxuna

+0

Si estoy usando RenderAction y esa acción a su vez devuelve PartialView, ni PartialView ni RenderAction tienen una sobrecarga ViewDataDictionary que puedo ver. Esperaba que fuera una sobrecarga en 'return PartialView ('. Cualquier sugerencia? – AaronLS

Cuestiones relacionadas