ASP.NET MVC 2 - префикс ViewModel - PullRequest
       33

ASP.NET MVC 2 - префикс ViewModel

12 голосов
/ 19 марта 2010

Я хочу использовать 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 ]

12 голосов
/ 21 марта 2011

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

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

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

Спасибо R0MANARMY за указание на это.

8 голосов
/ 19 марта 2010

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

0 голосов
/ 19 марта 2010

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

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

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

0 голосов
/ 19 марта 2010

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

...