如何获取分配给窗体视图模型的 DropDownListFor 的值



我有一个类似的ViewModel,我在我的页面上使用,并且已经以一种包含其他ViewModel作为属性的方式实现,因为我的表单需要与页面使用的视图模型分开。

产品页面视图模型

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

产品品牌视图模型

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 和描述作为值和文本的选择列表,当我加载页面并检查源代码时,它会在 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>绑定到复杂对象的集合。您需要一个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>元素(单击它们不会将焦点设置为关联的控件)

最新更新