簡體   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