2010-03-18 19 views
12

Ich möchte RenderPartial zweimal in meiner Ansicht mit verschiedenen verbundenen Modellen verwenden. Das Problem ist, dass einige Eigenschaften in beiden Modellen vorhanden sind (Nickname, Passwort). Sie haben kein Präfix, also sind auch die IDs oder Namen in der Ausgabe gleich. Nun, wenn ich Modellfehler für Nickname oder Passwort habe, werden beide Felder hervorgehoben.ASP.NET MVC 2 - ViewModel Prefix

Hauptansicht:

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

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

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

Wie kann ich das ändern?

Antwort

8

Anstatt Html.RenderPartial zu verwenden, könnten Sie editor templates verwenden, die mit Präfixen umgehen.

So in der Hauptansicht:

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

Und dann erstellen Sie einen Ordner Views/Shared/EditorTemplates/RegisterModel.ascx (Der Name dieser Datei wird im EditorFor Helper-Methode verwendet wird). Beachten Sie auch, dass dieser Teil sollte stark auf die Art der RegisterModel Eigenschaft eingegeben werden:

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

Sie könnten eine andere teilweise für den Login-Modell definieren in Views/Shared/EditorTemplates/LoginModel.ascx

0

Es sieht so aus, als gäbe es eine Überladung für TextBoxFor, mit der Sie zusätzliche HTML-Attribute angeben können. Es ist keine ideale Lösung, aber Sie sollten die ID (und möglicherweise den Namen?) Der gerenderten Textfelder ändern können. Natürlich würde das Ändern des Namens wahrscheinlich Dinge vermasseln, wenn Sie versuchen, das Formular zu veröffentlichen.

0

Zuerst können Sie Html.TextBox("input form name", ...) verwenden und den Namen auf was auch immer Sie wünschen einstellen. Es gibt ein größeres Problem, wie würden Sie ein Präfix auf Html.RenderPartial() Ebene bereitstellen? Sie stellen bereits eine Modellinstanz bereit. Ohne ihre Ansichtsmodelle zu ändern, gibt es nur eine weitere Möglichkeit: Ihre eigenen Überladungen für RenderPartial() zu schreiben, die das Präfix übernehmen und an andere weitergeben würden.

Überprüfen Sie diese. Jemand hat eine ganze Reihe von Überladungen geschrieben, die das Setzen von Präfixen unterstützen. TextBoxFor rendering to HTML with prefix on the ID attribute

Wenn etwas fehlt, können Sie das Muster sehen, wie Sie diese mit zusätzlichen, die Sie benötigen, erweitern können.

+1

Sie müssen nicht Ihre eigene Überladung für RenderPartial schreiben, es gibt bereits eine Überladung, die Sie neu definieren können, was die ViewData-Sammlung ist. Sie können einfach Ihr Präfix hinzufügen und Ihr Modell danach suchen lassen. Siehe: http://msdn.microsoft.com/en-us/library/dd470827.aspx – R0MANARMY

12

Wenn Sie keine EditorTemplate für einige tun können Aus diesem Grund können Sie dies in Ihrer Ansicht tun:

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

Und siehe, alle Eingaben in Ihrem PartialView werden vorangestellt.

Kudos zu R0MANARMY für das hinweisend.

+2

und als ein Liner: Html.RenderPartial ("myPartialViewName", myPartialViewModel, neues ViewDataDictionary() {TemplateInfo = neues TemplateInfo() {HtmlFieldPrefix = "meinPrefixHere"}}) –

+0

Das ist großartig, danke – karaxuna

+0

Wenn ich RenderAction verwende und diese Aktion wiederum PartialView zurückgibt, weder PartialView Noch RenderAction hat eine ViewDataDictionary-Überladung, die ich sehen kann. Ich hatte gehofft, es wäre eine Überladung auf 'Rückkehr PartialView ('. Irgendwelche Vorschläge? – AaronLS