【问题标题】:MVC4 model binding - Passing Custom View Models & values from view to controllerMVC4 模型绑定 - 将自定义视图模型和值从视图传递到控制器
【发布时间】:2014-03-06 19:27:22
【问题描述】:

我有一个具有以下模型的强类型视图。

public class ProductViewModel
{
    public Product Product { get; set; }
    public List<ProductOptionWithValues> ProductOptionsWithValues { get; set; }
}

public class ProductOptionWithValues
{
    public ProductOption ProductOption;
    public List<AllowedOptionValue> AllowedOptionValues;
}

我正在使用这个模型来填充一个表单,用户可以在其中选择他们想要的产品选项。 这是风景。

@model AsoRock.Entities.ViewModels.ProductViewModel

@{
    ViewBag.Title = "Details";
}
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) 
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <h3> 
        @Html.DisplayFor(model => model.Product.ProductName)

        ----> @Html.DisplayFor(model => model.Product.Price) 
    </h3>
    <br/>

    foreach (var item in Model.ProductOptionsWithValues)
    {
        <b>@Html.DisplayFor(modelItem => item.ProductOption.Option.OptionName)</b>
        <br/>

        @Html.DropDownListFor(m => m.ProductOptionsWithValues, 
                new SelectList(item.AllowedOptionValues, 
                "Id", "DisplayString", 
                item.AllowedOptionValues.First().Id))
        <br/>
    }
    <input type="submit" value="Add to cart" />
}

在我的控制器中,我试图将模型传回。当我在控制器中设置断点时,它会命中它,但 Product 视图模型是空的,有什么想法可以将视图中选择的值返回到我的控制器中吗?

[HttpPost]
public ActionResult Details(ProductViewModel ProductViewModel)
{
    return View();
    //return View();
}

【问题讨论】:

  • 将您的型号名称更改为public ActionResult Details(ProductViewModel model) 并检查。

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

如 cmets 中所述,您需要将 viewmodel 参数的名称从 ProductViewModel 更改为其他名称,例如

[HttpPost]
public ActionResult Details(ProductViewModel viewModel)
{
}

现在很奇怪viewModel 参数没有设置为类的实例。 MVC 模型绑定器仍将创建 ProductViewModel 的实例,即使它的任何属性都未设置为任何值。您没有使用自定义模型绑定器吗?

另外我强烈建议您的视图模型类没有Product 属性。相反,请在视图模型中专门为您打算使用的 Product 属性创建属性,例如

public class ProductViewModel
{
    public string ProductName { get; set; }
    public decimal ProductPrice { get; set; }
    public List<ProductOptionWithValues> ProductOptionsWithValues { get; set; }
}

在视图模型中使用Product 有点违背了拥有视图模型的意义。视图模型应仅包含视图所需的最低限度。包含Product 意味着视图模型现在因不使用/不需要的额外数据而变得臃肿。

编辑:

在您的情况下,我会剥离视图本身,只使用一小部分视图模型,然后 POST 到控制器以查看发生了什么。如果 viewmodel calss 不为 NULL,则返回视图并添加另一个位。继续这样做,直到 viewmodel 再次为 NULL。一点一点地做这个应该会有所帮助。

【讨论】:

  • 不,我没有使用任何自定义绑定,您说我的 productviewmodel 中不应包含产品类,我不确定我是否同意。在我看来,我正在使用我的产品类的每个属性。我已经在 post 方法中更改了参数的名称,当我到达断点时它仍然为空......理想情况下,当有帖子时我想要返回的是我传递给视图的同一个对象,但有一些指示从视图中的 N 个下拉列表中选择了哪些选项。
  • 啊,好吧,代码中并不清楚,但是如果您使用与“产品”相关的所有内容,那么在这种情况下将其作为视图模型的一部分传递是有意义的。跨度>
  • 刚回到电脑上...会破解它...但现在仍然返回 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多