将视图模型传递给ASP.NET MVC 3编辑控制器

时间:2011-07-11 13:33:51

标签: asp.net-mvc asp.net-mvc-3

将视图模型(如下所示)传递给视图时,如何确保我正在创建的复选框(映射到此处的“Product”项)被传递回控制器?

我已将视图模型和“发布”产品控制器包含在下面。

不幸的是,当回发到控制器时,“Products”为空。

namespace MyProject.Models
{
    public class ChartViewModel
    {
        public Chart ChartItem { get; set; }
        public IEnumerable<Product> Products { get; set; }
    }
}

控制器:

    [Authorize]
    [ValidateInput(false)]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(ChartViewModel objChartViewModel)
    {

        if (!TryUpdateModel(objChartViewModel))
        {
            return View(objChartViewModel);
        }
        else
        {

        } return View("Details", objChartViewModel);

    }

如何将复选框添加到我的视图中,映射到视图模型中的“Product”对象:

@{
   foreach (MyProject.Models.Product objProduct in Model.Products)
 {
            @Html.CheckBox("product" + objProduct.Id, Model.ChartItem.ChartProducts.Select(t => t.ProductId).Contains(objProduct.Id));
            @String.Format("{0} {1}", objProduct.Manufacturer.Name, objProduct.Name);<br />
 }
}

1 个答案:

答案 0 :(得分:1)

您可以将列表(IEnumerable<T>)向下发送到视图,但是当它们没有返回到控制器时。 ViewModel中唯一具有值的属性是表单集合中具有完全匹配项的属性。因此,像SelectedProductID一样向ViewModel添加属性。

这会设置一个下拉列表,将其选定的值发送回控制器:

<div class="editor-field"> 
    @Html.DropDownListFor(m => m.SelectedEmployeeID,
        new SelectList(Model.EmployeeList, "EmployeeID", "EmployeeName"), "--Please select an Employee--")
    @Html.ValidationMessageFor(model => model.SelectedEmployeeID)
</div>

注意:正在设置的属性为SelectedEmployeeID,但这来自EmployeeList

在你的情况下,许多人都在集合中的值(只有“已选中”复选框才能在帖子中发送)所以你可以这样做:

string value = collection["myProductID"];

如果它已经检查过。

抱歉这个混乱,这有点匆忙。有关详细信息,请参阅此信息:
MVC 3 form post and persisting model data