代码之家  ›  专栏  ›  技术社区  ›  Barbaros Alp

使用MVC 2强类型HTML助手的自定义ViewModel在创建时返回空对象?

  •  4
  • Barbaros Alp  · 技术社区  · 15 年前

    尝试使用自定义视图建模的创建表单创建实体时遇到问题。下面是我的类别创建表单的自定义视图模型。

    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>
    

    我怎么修这个?

    3 回复  |  直到 13 年前
        1
  •  8
  •   Matt Spradley    15 年前

    视图模型需要一个没有参数的默认构造函数,并且每个属性都需要公共的set方法。默认的模型绑定器使用公共设置器来填充对象。


    默认的模型绑定器有一些它遵循的规则。它按以下顺序选择要绑定到的数据:

    1. 来自日志的表单参数
    2. 在global.asax.cs中由路由定义定义的URL路由数据
    3. 查询字符串参数

    然后,默认模型绑定器使用几种策略绑定到操作方法中的模型/参数:

    1. 完全匹配的名称
    2. 与prefix.name匹配,其中prefix是父类,name是子类/属性
    3. 没有前缀的名称(只要没有冲突,就不必担心提供前缀)

    可以使用bind属性中的多个选项覆盖行为。这些包括:

    • [绑定(prefix=“somePrefix”)] --强制映射到由前缀标识的特定父类。
    • [绑定(包括=“val1,val2”)] --要绑定到的名称白名单
    • [绑定(exclude=“val1,val2”)] --要从默认行为中排除的名称
        2
  •  2
  •   Darin Dimitrov    15 年前

    您可以使用编辑器模板。将您的ascx控件放入 ~/Views/Shared/EditorTemplates/SomeControl.ascx . 然后在主视图(ASPX页面)中包含类似这样的模板(假设视图是强类型的 CategoryFormViewModel ):

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

    而不是

    <% Html.RenderPartial("SomeControl", Model) %>
    
        3
  •  2
  •   LPL user462990    13 年前

    为您的ViewModel创建一个默认的构造函数,并在其中初始化类别。

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

    在你的控制器上接收视图模型

    public ActionResult ActionName(CategoryFormViewModel model)
    {
        //here you can access model.Category.Title
    }
    
    推荐文章