2010-03-18 6 views
12

Desidero utilizzare RenderPartial due volte nella mia vista con diversi modelli associati. Il problema è che alcune proprietà sono presenti in entrambi i modelli (nickname, password). Non hanno alcun prefisso, quindi anche l'id o i nomi sono uguali nell'output. Ora, se ho errori di modello per nickname o password, entrambi i campi vengono evidenziati.ASP.NET MVC 2 - Prefisso ViewModel

Vista principale:

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

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

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

Come posso cambiare questo?

risposta

8

Invece di utilizzare Html.RenderPartial è possibile utilizzare editor templates che gestirà i prefissi.

Quindi nel tuo vista principale:

<div> 
    <%-- See below what does the second argument mean --%> 
    <%= Html.EditorFor(x => x.RegisterModel, "RegisterModel") %> 
</div> 
<div> 
    <%= Html.EditorFor(x => x.LoginModel, "LoginModel") %> 
</div> 

e quindi creare una cartella Views/Shared/EditorTemplates/RegisterModel.ascx (Il nome di questo file è utilizzata nel metodo di supporto EditorFor). Si noti inoltre che questo parziale dovrebbe essere fortemente tipizzato al tipo di proprietà 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> 
<% } %> 

è possibile definire una diversa parziale per il modello di accesso in Views/Shared/EditorTemplates/LoginModel.ascx

0

Sembra che ci sia un sovraccarico per TextBoxFor che consente di specificare attributi HTML aggiuntivi. Non è una soluzione ideale, ma dovrebbe consentire di cambiare l'id (e possibilmente il nome?) Delle caselle di testo renderizzate. Ovviamente cambiare il nome potrebbe rovinare tutto quando si tenta di pubblicare il modulo.

0

Prima di tutto, è possibile utilizzare Html.TextBox("input form name", ...) e impostare il nome in base alle proprie esigenze. C'è un problema più grande come potresti fornire un prefisso al livello Html.RenderPartial()? Stai già fornendo un'istanza di modello. Quindi, senza modificare i loro modelli di visualizzazione, c'è solo un'altra possibilità: scrivere i propri sovraccarichi per RenderPartial() che prenderebbe il prefisso e lo passerebbe agli altri.

Controllare questo fuori. Qualcuno ha scritto un sacco di sovraccarichi che supportano l'impostazione dei prefissi. TextBoxFor rendering to HTML with prefix on the ID attribute

Se manca qualcosa, è possibile vedere lo schema come estenderlo con altri che potrebbero essere necessari.

+1

Non è necessario scrivere il proprio sovraccarico per RenderPartial, c'è già un sovraccarico che consente di ridefinire cosa sia la raccolta ViewData. Puoi semplicemente aggiungere il tuo prefisso lì e far cercare il tuo modello. Vedere: http://msdn.microsoft.com/en-us/library/dd470827.aspx – R0MANARMY

12

Se non è possibile fare un EditorTemplate per un po ' ragione, si può fare questo nel vostro Vista:

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

ed ecco, tutti gli ingressi nella vostra PartialView saranno preceduti.

Complimenti a R0MANARMY per indicare questo.

+2

e come un unico supporto: Html.RenderPartial ("myPartialViewName", myPartialViewModel, new ViewDataDictionary() {TemplateInfo = new TemplateInfo() {HtmlFieldPrefix = "myPrefixHere"}}) –

+0

È fantastico, grazie – karaxuna

+0

Se utilizzo RenderAction e quell'azione a sua volta restituisce PartialView, né PartialView né RenderAction ha un sovraccarico di ViewDataDictionary che posso vedere. Speravo che sarebbe stato un sovraccarico su 'return PartialView ('. Qualsiasi suggerimento? – AaronLS