我有一个麻烦,而试图创建一个实体与一个定义视图模仿创建形式。下面是我的定义视图模型分类的创造形式。

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

这是我的用户控制那里的

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

我如何能解决这个问题?

有帮助吗?

解决方案

你的视图模型中需要一个默认的构造不参数和你需要的公共设置方法,为每个特性。默认的模式粘合剂使用公共制定者来填充的对象。


默认的模式粘合剂有些规则如下。它选择的是什么数据结合在以下顺序:

  1. 形式的参数,从一个岗位
  2. Url路线数据定义的途的定义在全球性的。asax.cs
  3. 查询参数字符串

默认的模式粘合剂然后使用几个战略结合模式/参数,在你行动的方法:

  1. 的确切名称匹配
  2. 比赛的前缀。名前缀被父类和名称是亚类/产
  3. 名字没有前缀(只要没有冲突你不必担心提供的前缀)

你可以复盖该行为有几个选项,从绑定的属性。这些包括:

  • [Bind(Prefix="someprefix")] --部队地图以一个特定的父类确定的前缀。
  • [Bind(包括="val1,val2")] --白名单的名称结合
  • [结合(排除="val1,val2")] --名称排除从默认的行为

其他提示

您可以使用编辑器模板。放入~/Views/Shared/EditorTemplates/SomeControl.ascx你的ascx控件。然后,你的主视图(aspx页面)里面包括像这样(假设你的看法是强类型到CategoryFormViewModel)模板:

<%= Html.EditorForModel("SomeControl") %>

,而不是

<% Html.RenderPartial("SomeControl", Model) %>

请默认的构造函数为您的视图模型和初始化类中有

public CategoryFormViewModel() 
{ 
    Category = new Category()
}

和在您的控制器动作收到视图模型

public ActionResult ActionName(CategoryFormViewModel model)
{
    //here you can access model.Category.Title
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top