2014-03-06 47 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

剛回到電腦上...戈納有一個裂縫...但現在還是空着。 –