ASP.NET MVC 2 - префикс ViewModel
Я хочу использовать RenderPartial дважды на мой взгляд с различными моделями, связанными. Проблема в том, что некоторые свойства присутствуют в обеих моделях (ник, пароль). У них нет префикса, поэтому даже идентификаторы или имена одинаковы в выходных данных. Теперь, если у меня есть ошибки модели для псевдонима или пароля, оба поля подсвечиваются.
Главный вид:
<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>
<% } %>
Как я могу это изменить?
4 ответа
Вместо того, чтобы использовать Html.RenderPartial
Вы можете использовать шаблоны редактора, которые будут обрабатывать префиксы.
Итак, в вашем основном виде:
<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
Если по какой-то причине вы не можете создать EditorTemplate, вы можете сделать это в своем View:
var dataDict = new ViewDataDictionary();
dataDict.TemplateInfo.HtmlFieldPrefix = "myPrefixHere";
Html.RenderPartial("myPartialViewName", myPartialViewModel, dataDict);
И вот, все входы в вашем PartialView будут иметь префикс.
Слава R0MANARMY за указание на это.
Похоже, существует перегрузка для TextBoxFor, которая позволяет указывать дополнительные атрибуты HTML. Это не идеальное решение, но оно должно позволить вам изменить идентификатор (и, возможно, имя?) Отображаемых текстовых полей. Конечно, изменение имени, вероятно, испортит ситуацию, когда вы попытаетесь опубликовать форму.
Прежде всего, вы могли бы использовать Html.TextBox("input form name", ...)
и установите имя на то, что вы хотите. Есть большая проблема, как бы вы предоставили префикс на Html.RenderPartial()
уровень? Вы уже предоставляете экземпляр модели. Таким образом, не меняя их модели представления, есть еще одна возможность: написать свои собственные перегрузки для RenderPartial()
что бы взять префикс и передать его другим.
Проверьте это. Кто-то написал целую кучу перегрузок, которые поддерживают префиксы настроек. TextBox для рендеринга в HTML с префиксом атрибута ID
Если что-то отсутствует, вы можете увидеть шаблон, как дополнить их дополнительными, которые вам могут понадобиться.