【问题标题】:Model binding for a ViewModel containing multiple objects包含多个对象的 ViewModel 的模型绑定
【发布时间】:2010-07-16 16:31:37
【问题描述】:

我有一个 ProductListingViewModel 类型的强类型视图,它又包含一个 ProductViewModel。 (两种自定义视图模型)。

我的页面上有一些表单元素,它们是这样创建的:

<%: Html.DropDownListFor(m => m.ProductViewModel.CategoryId, Model.Categories)%>

生成 HTML:

<select name="ProductViewModel.CategoryId" id="CategoryId">

使用默认模型绑定,我希望当我发布到接受 ProductListingViewModel 类型参数的控制器操作时,它会知道使用相关数据填充 ProductViewModel.CategoryId。

选择列表的名称似乎表明它知道有一个具有 CategoryId 属性的 ProductViewModel 但是当我发布到我的控制器方法时,ProductViewModel 为空。如果我在 ProductListingViewModel 的构建过程中创建它,那么它不再为空,但默认绑定器似乎没有像我预期的那样填充属性。

这是自定义模型绑定器的情况,还是我只是缺少一些基本的东西?

干杯。

【问题讨论】:

    标签: c# asp.net-mvc-2 model-binding model-view


    【解决方案1】:

    让我试着总结一下(如果我错了,请纠正我)。

    型号:

    public class ProductListingViewModel
    {
        public ProductViewModel ProductViewModel { get; set; }
        public IEnumerable<SelectListItem> Categories { get; set; }
    }
    
    public class ProductViewModel
    {
        public string CategoryId { get; set; }
    }
    

    控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new ProductListingViewModel
            {
                Categories = new SelectList(new[]
                {
                    new { Value = "1", Text = "category 1" },
                    new { Value = "2", Text = "category 2" }
                }, "Value", "Text")
            };
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(ProductListingViewModel model)
        {
            return View(model);
        }
    }
    

    查看:

    <% using (Html.BeginForm()) { %>
        <%: Html.DropDownListFor(m => m.ProductViewModel.CategoryId, Model.Categories)%>
        <input type="submit" value="OK" />
    <% } %>
    

    现在,当您提交表单时,您将获得:

    model.ProductViewModel.CategoryId = the id that was selected in the drop down list
    

    这不是你所追求的吗?

    【讨论】:

    • 嘿达林。这看起来和我正在做的几乎一模一样。问题是,当我提交表单时,model.ProductViewModel 为空。如果我在 ProductListingViewModel 的构造函数中创建 ProductViewModel 则它不再为空,但它不包含我发布的任何值。
    • 我猜是这个几乎相同会造成问题,因为我发布的内容有效。
    • 我已经把它和你的例子完全一样了,但我仍然得到一个空值。奇怪的。我一定做错了什么,但我不确定是什么。
    • 还有达林,这里有点不太明白。在您的示例中,您不会在将 ProductListingViewModel 传递给视图之前创建 ProductViewModel。当我尝试这个时,我得到一个异常,因为 m.ProductViewModel 为空。
    • 是的,这是因为您的参数不能与模型中的属性名称相同,因为模型绑定器无法区分它们。
    【解决方案2】:

    在我看来,默认的活页夹应该适用于这种情况。

    您是否尝试使用 Fiddler 检查客户端发送的数据?

    控制器动作的签名究竟是什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多