繁体   English   中英

MVC4模型绑定-将自定义视图模型和值从视图传递到控制器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM