Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вместо 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

Ответ 2

Если вы не можете сделать EditorTemplate по какой-либо причине, вы можете сделать это в своем представлении:

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

Lo и вот, все входы в PartialView будут префиксами.

Претензии к R0MANARMY для указания этого.

Ответ 3

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

Ответ 4

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

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

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