模型为包含多个对象的一个​​ViewModel结合(Model binding for a View

2019-10-28 22:47发布

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

我有我的网页上某种形式的元素和它们像这样创建的:

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

其生成HTML:

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

使用默认的模型结合我所料,当我张贴到其接受类型ProductListingViewModel的参数,它会知道的有关数据来填充ProductViewModel.CategoryId我的控制器动作。

选择列表中的名称似乎表明,它知道有一个类别ID属性然而,当我张贴到我控制器的方法,该ProductViewModel为null ProductViewModel。 如果我建ProductListingViewModel期间创建这个那么它不再为空,但默认的粘结剂似乎并不如我想像的要填充的属性。

这是一个自定义模型粘合剂的情况下,还是我只是缺少一些基本的东西?

干杯。

Answer 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

是不是你所追求的?



Answer 2:

在我看来,默认粘结剂应在这种情况下工作。

你尝试使用招来检查从客户端发送的数据?

到底是什么控制器动作的签名?



文章来源: Model binding for a ViewModel containing multiple objects