2010-03-18 1 views
12

Я хочу использовать RenderPartial дважды в моем представлении с различными связанными моделями. Проблема в том, что некоторые свойства присутствуют в обеих моделях (псевдоним, пароль). У них нет префикса, поэтому даже идентификаторы или имена равны на выходе. Теперь, если у меня есть ошибки модели для псевдонима или пароля, оба поля будут выделены.ASP.NET MVC 2 - Префикс префикса ViewModel

Главная Вид:

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

Войти 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> 
<% } %> 

Регистрация 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> 
<% } %> 

Как я могу изменить это?

ответ

8

Вместо использования Html.RenderPartial вы можете использовать editor templates, который будет обрабатывать префиксы.

Так что в вашем главном окне:

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

А затем создать папку Views/Shared/EditorTemplates/RegisterModel.ascx (Имя этого файла используется в методе EditorFor хелперов). Также обратите внимание, что это частичное должно быть строго типизированными к типу 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> 
<% } %> 

Вы можете определить различные парциальное для модели входа в Views/Shared/EditorTemplates/LoginModel.ascx

0

Похоже, есть перегрузка для TextBoxFor, что позволяет указать дополнительные атрибуты HTML. Это не идеальное решение, но оно должно позволить вам изменить идентификатор (и, возможно, имя?) Отображаемых текстовых полей. Конечно, изменение названия, вероятно, повредит, когда вы попытаетесь опубликовать форму.

0

Прежде всего, вы можете использовать Html.TextBox("input form name", ...) и установить имя в любое удобное для вас время. Есть большая проблема, как бы вы предоставили префикс на уровне Html.RenderPartial()? Вы уже предоставляете экземпляр модели. Таким образом, без изменения их моделей взглядов есть еще одна возможность: написать свои собственные перегрузки для RenderPartial(), которые будут использовать префикс и передавать его другим.

Проверьте это. Кто-то написал целую кучу перегрузок, которые поддерживают настройку префиксов. TextBoxFor rendering to HTML with prefix on the ID attribute

Если какой-либо отсутствует, вы можете увидеть шаблон, как продлить его с помощью дополнительных, которые вам могут понадобиться.

+1

Вам не нужно писать собственную перегрузку для RenderPartial, есть перегрузка, позволяющая вам переопределить, что такое коллекция ViewData. Вы можете просто добавить свой префикс туда и попросить свою модель. См. Http://msdn.microsoft.com/en-us/library/dd470827.aspx – R0MANARMY

12

Если вы не можете сделать EditorTemplate для некоторых причина, вы можете сделать это на ваш взгляд:

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

глядь, все входы в вашем PartialView будет приставкой.

Kudos to R0MANARMY для указания этого.

+2

и как один вкладыш: Html.RenderPartial («myPartialViewName», myPartialViewModel, новый ViewDataDictionary() {TemplateInfo = new TemplateInfo() {HtmlFieldPrefix = "myPrefixHere"}}) –

+0

Это замечательно, спасибо – karaxuna

+0

Если я использую RenderAction, и это действие, в свою очередь, возвращает PartialView, ни PartialView или RenderAction имеют перегрузку ViewDataDictionary, которую я вижу. Я надеялся, что это будет перегрузка на 'return PartialView ('. Любые предложения? – AaronLS

 Смежные вопросы

  • Нет связанных вопросов^_^