2014-03-06 48 views
0

我有一个强类型的视图与以下模型。MVC4模型绑定 - 通过自定义视图模型和值从视图到控制器

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(); 
} 
+0

return查看模型 – Tim

+0

将您的模型名称更改为'public ActionResult Details(ProductViewModel model)'并检查。 – Jaimin

+0

这没有奏效.. –

回答

0

正如评论所说,你需要的视图模型参数的名字从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排序击败具有视图模型的点。视图模型应该只包含视图需要的最小值。包括Product意味着视图模型现在变得臃肿,没有使用/需要额外的数据。

编辑:

在你的鞋,我会剥离下来的观点本身,仅使用视图模型的小块,和POST到控制器,看看会发生什么。如果viewmodel calss不为NULL,则返回视图并再添加一点。继续这样做直到viewmodel再次为NULL。这样做一点一点应该会有所帮助。

+0

不,我没有使用任何自定义绑定,你说我不应该在我的productviewmodel里有产品类,我不确定我是否同意。在我看来,我正在使用我的产品类的每个属性。我在post方法中更改了参数的名称,当我点击中断点时它仍然为空......理想情况下,当有一个帖子时,我想要返回的是与传递给视图的同一对象,但有一些指示从视图中的N个下拉列表中选择哪些选项。 –

+0

Ahh好的,在代码中并不清楚,但是如果你使用与'Product'相关的所有东西,那么在这种情况下,将它作为视图模型的一部分传递是有道理的。 –

+0

刚回到电脑上...戈纳有一个裂缝...但现在还是空着。 –