asp.net - 具有 MVC 2 强类型 HTML 助手的自定义 ViewModel 在创建时返回空对象?

标签 asp.net asp.net-mvc-2 strongly-typed-view

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

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

当我单击保存按钮时,它不会为我绑定(bind)类别,因为我使用的是自定义 View 模型和强类型的 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>

我怎样才能解决这个问题?

最佳答案

您的 View 模型需要一个没有参数的默认构造函数,并且您需要为每个属性设置公共(public)设置方法。默认模型绑定(bind)器使用公共(public) setter 来填充对象。

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

  • 来自帖子的表单参数
  • 由您在 global.asax.cs
  • 中的路由定义定义的 URL 路由数据
  • 查询字符串参数

  • 然后,默认模型绑定(bind)器使用几种策略来绑定(bind)到您的操作方法中的模型/参数:
  • 完全匹配
  • 与 prefix.name 匹配,其中 prefix 是父类,name 是子类/属性
  • 没有前缀的名称(只要没有冲突,您不必担心提供前缀)

  • 您可以使用 Bind 属性中的多个选项覆盖该行为。这些包括:
  • [绑定(bind)(前缀 = "someprefix")] -- 强制映射到由前缀标识的特定父类。
  • [绑定(bind)(包括=“val1,val2”)] -- 要绑定(bind)的名称白名单
  • [绑定(bind)(排除 = "val1, val2")] -- 从默认行为中排除的名称
  • 关于asp.net - 具有 MVC 2 强类型 HTML 助手的自定义 ViewModel 在创建时返回空对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2494940/

    相关文章:

    asp.net-mvc-2 - ASP.NET MVC2 - 在模型绑定(bind)器中解析参数属性

    asp.net-mvc - 如何在没有 ViewData 的情况下绑定(bind) Html.DropDownList(强类型 View )

    c# - 使用健康监控的 ASP.NET Web 应用程序日志记录不起作用

    asp.net - 为什么输入元素不呈现在 ASP.Net MVC 中传递的值?

    c# - 将 Ajax 数组发送到 Controller

    asp.net-mvc - ASP.NET MVC 是否有强类型 View ?

    c# - 如何获得强类型 MVC View 以回发它传递的模型实例?

    c# - session 变量并将它们保存到数据库

    jquery - ASP.MVC 不加载 jQuery 包

    javascript - Javascript 中的 Html.Action 包含 js var 作为参数