12

我想在我的视图中使用 RenderPartial 两次,并关联不同的模型。问题是两个模型中都存在一些属性(昵称、密码)。它们没有前缀,因此即使是 id 或名称在输出中也是相等的。现在,如果我有昵称或密码的模型错误,这两个字段都会突出显示。

主视图:

<div>
    <% Html.RenderPartial("Register", Model.RegisterModel); %>
</div>
<div>
    <% Html.RenderPartial("Login", Model.LoginModel); %>
</div>

登录部分视图:

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

注册部分视图:

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

4 回答 4

12

如果由于某种原因您不能执行 EditorTemplate,您可以在您的视图中执行此操作:

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

瞧,您的 PartialView 中的所有输入都将带有前缀。

感谢 R0MANARMY 指出这一点。

于 2011-03-21T15:45:45.507 回答
8

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

于 2010-03-19T07:45:52.513 回答
0

看起来TextBoxFor有一个重载,允许您指定额外的 HTML 属性。这不是一个理想的解决方案,但它应该让您更改呈现的文本框的 id(可能还有名称?)。当然,当您尝试发布表单时,更改名称可能会搞砸。

于 2010-03-19T06:06:32.780 回答
0

首先,您可以使用Html.TextBox("input form name", ...)并将名称设置为您想要的任何名称。还有一个更大的问题是如何在Html.RenderPartial()级别上提供前缀?您已经在提供模型实例。因此,在不改变他们的视图模型的情况下,只有另一种可能性:编写您自己的重载RenderPartial(),以获取前缀并将其传递给其他人。

看看这个。有人写了一大堆支持设置前缀的重载。TextBoxFor 呈现为带有 ID 属性前缀的 HTML

如果缺少任何内容,您可以查看如何使用您可能需要的其他内容扩展这些模式。

于 2010-03-19T06:49:05.357 回答