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

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

12
задан DaveRandom 25 February 2013 в 21:21
поделиться

3 ответа

Вместо использования 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

8
ответ дан 2 December 2019 в 18:18
поделиться

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

Посмотрите на это. Кто-то написал целую кучу перегрузок, поддерживающих установку префиксов. TextBoxДля рендеринга в HTML с префиксом на атрибуте ID

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

0
ответ дан 2 December 2019 в 18:18
поделиться

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

0
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: