Я хочу использовать 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>
<% } %>
Как я могу изменить это?
Вместо использования 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
Во-первых, вы могли бы использовать Html.TextBox("input form name", ...)
и задать имя, какое пожелаете. Есть более серьезный вопрос, как вы обеспечите префикс на уровне Html.RenderPartial()
? Вы уже предоставляете экземпляр модели. Поэтому, не меняя модели представления, есть еще одна возможность: написать собственные перегрузки для RenderPartial()
, которые будут принимать префикс и передавать его другим.
Посмотрите на это. Кто-то написал целую кучу перегрузок, поддерживающих установку префиксов. TextBoxДля рендеринга в HTML с префиксом на атрибуте ID
Если чего-то не хватает, вы можете посмотреть шаблон, как расширить их дополнительными, которые могут вам понадобиться.
Похоже, есть перегрузка для TextBoxFor , которая позволяет вам указывать дополнительные атрибуты HTML. Это не идеальное решение, но оно должно позволить вам изменить идентификатор (и, возможно, имя?) Отображаемых текстовых полей. Конечно, изменение имени, вероятно, испортит ситуацию, когда вы попытаетесь опубликовать форму.