如何获取分配给表单视图模型的DropDownListFor的值

时间:2016-03-11 03:02:55

标签: c# asp.net-mvc forms http-post form-submit

我有一个ViewModel,就像我在我的页面上使用的那样,这已经以包含其他ViewModel作为属性的方式实现,因为我的表单需要一个与页面使用的单独视图模型。

ProductPageViewModel

public class ProductPageViewModel
{
    public ProductViewModel Product { get; set; }
    public IEnumerable<ProductBrandViewModel> ProductBrands { get; set; }
}

ProductBrandViewModel

public class ProductBrandViewModel
{
  public Guid ID {get;set;}
  public string Description {get;set;}
}

在我的视图中,我有一个表单,其中包含显示产品品牌的下拉列表

表格

<div class="modal fade" id="modAddProduct" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="myModalLabel">Modal title</h4>
        </div>
        <div class="modal-body">
            @using (Html.BeginForm("Index", "Products", FormMethod.Post, new {id = "frmAddProduct", @class = "frmAddProduct"}))
            {
                @Html.ValidationSummary(false, "There seems to be some missing information", new {@class = "alert alert-danger"})
                <div class="form-group">
                    <label for="txtProductName" class="control-label">Name:</label>
                    @Html.TextBoxFor(model => model.Product.Description, null, new {id = "txtProductName", @class="form-control", placeholder="Product Name"})
                </div>
                <div class="form-group">
                    <label for="txtProductBrand" class="control-label">Brand:</label>
                    @Html.DropDownListFor(model => model.ProductBrands, new SelectList(ViewBag.ProductBrands, "ID", "Description"), "Select Product Category", new { id = "ddProductCategory", @class = "form-control" })
                </div>
                <div class="form-group">

                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    <button type="submit" class="btn btn-success">Save changes</button>
                </div>
            }

        </div>
    </div>
</div>

我可以使用DropDownListFor帮助器,然后使用带有ID和描述作为值和文本的SelectList,当我加载页面并检查源时,这在HTML中正确呈现。

但问题是,当我单击提交按钮时,我没有将我的ID传递给控制器​​操作的参数。

控制器操作

    [HttpPost]
    public ActionResult Index(ProductViewModel product)
    {
        try
        {
            var productContract = Mapper.Map<ProductViewModel, ProductContract>(product);
            _productService.CreateProduct(productContract);
        }
        catch (Exception ex)
        {

            throw ex;
        }
        return null;
    }

1 个答案:

答案 0 :(得分:0)

您无法将<select>绑定到复杂对象的集合。您需要Guid属性来绑定选定的ProductBrandViewModel。将模型更改为

public class ProductPageViewModel
{
   public ProductViewModel Product { get; set; }
   public Guid SelectedBrand { get; set; }
   public IEnumerable<ProductBrandViewModel> ProductBrands { get; set; }
}

并在视图中使用

@Html.DropDownListFor(m => m.SelectedBrand , new SelectList(ViewBag.ProductBrands, "ID", "Description"), "Select Product Category", new { id = "ddProductCategory", @class = "form-control" })

但是,由于您的模型具有集合的属性,因此您可以使用所有ProductBrands项填充该属性,而不是使用ViewBag来传递集合,尽管更好的选择是财产

public IEnumerable<SelectListItem> ProductBrands { get; set; }

并在控制器中使用

model.ProductBrands = new SelectList(db.ProductBrands, "ID", "Description");

以便视图变为

@Html.DropDownListFor(m => m.SelectedBrand , Model.ProductBrands, "Select Product Category", new { @class = "form-control" }) // not clear why you want to change the `id` attribute

这当然假设ProductViewModel尚未包含所选品牌的Guid属性(在这种情况下,您可以绑定到该属性)

附注:使用@Html.LabelFor()正确生成标签(并使用[Display]属性(如果适用)。目前您创建的<label>元素不是标签(点击它们不会将焦点设置为关联控件)