[英]MVC4 model binding - Passing Custom View Models & values from view to controller
我有以下模型的强类型视图。
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" />
}
在我的控制器中,我试图将模型传回。 当我在控制器中设置一个断点时,命中了断点,但“产品”视图模型为空,是否有任何想法可以将在视图中选择的值返回到控制器中?
[HttpPost]
public ActionResult Details(ProductViewModel ProductViewModel)
{
return View();
//return View();
}
如评论中所述,您需要将Viewmodel参数的名称从ProductViewModel
更改为其他名称,例如
[HttpPost]
public ActionResult Details(ProductViewModel viewModel)
{
}
现在,很奇怪的是, viewModel
参数没有设置为该类的实例。 即使MVC模型联编程序的任何属性均未设置为任何值,它仍将创建ProductViewModel
的实例。 您是否没有使用自定义模型联编程序?
我也强烈建议您的viewmodel类没有Product
属性。 而是在视图模型中为要使用的Product
属性创建属性,例如
public class ProductViewModel
{
public string ProductName { get; set; }
public decimal ProductPrice { get; set; }
public List<ProductOptionWithValues> ProductOptionsWithValues { get; set; }
}
在视图模型中使用Product
失败拥有视图模型的观点。 viewmodel应该仅包含视图所需的最低要求。 包含Product
意味着该视图模型现在已经充斥了它不需要/不需要的额外数据。
编辑:
穿上鞋子,我将只使用viewmodel的一小部分精简视图本身,然后将其发布到控制器以查看会发生什么。 如果viewmodel calss不为NULL,请返回视图并添加另一位。 继续这样做,直到viewmodel再次为NULL。 一点一点地这样做应该会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.