我在尝试使用自定义视图建模创建表单创建实体时遇到麻烦。下面是我的类别创建表单的自定义视图模型。
public class CategoryFormViewModel
{
public CategoryFormViewModel(Category category, string actionTitle)
{
Category = category;
ActionTitle = actionTitle;
}
public Category Category { get; private set; }
public string ActionTitle { get; private set; }
}
这是我的用户控件,其中 UI 位于
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CategoryFormViewModel>" %>
<h2>
<span><%= Html.Encode(Model.ActionTitle) %></span>
</h2>
<%=Html.ValidationSummary() %>
<% using (Html.BeginForm()) {%>
<p>
<span class="bold block">Başlık:</span>
<%=Html.TextBoxFor(model => Model.Category.Title, new { @class = "width80 txt-base" })%>
</p>
<p>
<span class="bold block">Sıra Numarası:</span>
<%=Html.TextBoxFor(model => Model.Category.OrderNo, new { @class = "width10 txt-base" })%>
</p>
<p>
<input type="submit" class="btn-admin cursorPointer" value="Save" />
</p>
<% } %>
当我单击“保存”按钮时,它不会为我绑定类别,因为我正在使用自定义视图模型和强类型的 html 帮助程序
<%=Html.TextBoxFor(model => Model.Category.OrderNo) %>
我的 html 源看起来像这样
<form action="/Admin/Categories/Create" method="post">
<p>
<span class="bold block">Başlık:</span>
<input class="width80 txt-base" id="Category_Title" name="Category.Title" type="text" value="" />
</p>
<p>
<span class="bold block">Sıra Numarası:</span>
<input class="width10 txt-base" id="Category_OrderNo" name="Category.OrderNo" type="text" value="" />
</p>
<p>
<input type="submit" class="btn-admin cursorPointer" value="Kaydet" />
</p>
</form>
我怎样才能解决这个问题?
您的视图模型需要一个不带参数的默认构造函数,并且您需要每个属性的公共设置方法。默认模型绑定器使用公共设置器来填充对象。
默认模型绑定程序有一些遵循的规则。它按以下顺序选择要绑定的数据:
- 来自帖子的表单参数
- 由 global.asax.cs 中的路由定义定义的 URL 路由数据
- 查询字符串参数
然后,默认模型绑定器使用多种策略绑定到操作方法中的模型/参数:
- 姓名完全匹配
- 与 prefix.name 匹配,其中 prefix 是父类,name 是子类/属性
- 没有前缀的名称(只要不发生冲突,您就不必担心提供前缀)
您可以使用“绑定”属性中的多个选项来覆盖该行为。这些包括:
-
[绑定(前缀=“someprefix”)]-- 强制映射到由前缀标识的特定父类。
-
[绑定(包括=“val1,val2”)]-- 要绑定的名称白名单
-
[绑定(排除=“val1,val2”)]-- 从默认行为中排除的名称
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)