我有一个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">×</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;
}
答案 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>
元素不是标签(点击它们不会将焦点设置为关联控件)