我如何获得分配给表单视图模型的 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">×</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>
元素(点击它们不会将焦点设置到关联的控件)
我有一个 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;
}
您不能将 <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>
元素(点击它们不会将焦点设置到关联的控件)