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

How do i get the value of my DropDownListFor assigned to a form view model

我有一个 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;
    }

您不能将 <select> 绑定到复合 objects 的 collection。您需要一个 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" })

但是,由于您的模型有 collection 的 属性,因此您可以使用所有 ProductBrands 项目填充 属性,而不是使用 ViewBag 传递 collection,尽管更好的选择是使 属性

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> 元素(点击它们不会将焦点设置到关联的控件)