我正在尝试从我的表单向我的控制器操作提交类型为 ProductBrandViewModel 的视图模型,但视图模型上的属性name
最终为null,即使值为从表格传来。
表格
<div class="modal fade" id="modAddProductBrand" 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">Add Brand</h4>
</div>
<div class="modal-body">
@using (Html.BeginForm("Create", "ProductBrands", FormMethod.Post, new {id = "frmProductBrand"}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(false, "You have not entered a name for your brand", new {@class="alert alert-danger"})
<div class="form-group">
@Html.LabelFor(model => model.ProductBrand.Name)
@Html.TextBoxFor(model => model.ProductBrand.Name, null, new {id = "txtProductBrandName", @class = "form-control", placeholder = "Brand Name"})
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-success" id="btnCreateProductBrand"> Save Changes</button>
</div>
}
</div>
</div>
</div>
</div>
发布操作
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ProductBrandViewModel brand)
{
if (!ModelState.IsValid) return null;
try
{
var userSessionViewModel = GetUserSession();
var createdProductBrand = CreateProductBrand(userSessionViewModel.Business, brand);
return RedirectToAction("Index");
}
catch
{
return View("Index");
}
}
ProductBrandViewModel
public class ProductBrandViewModel
{
public Guid Id { get; set; }
[Required]
[Display(Name = "Brand Name")]
public string Name { get; set; }
public int ProductCount { get; set; }
}
答案 0 :(得分:0)
在您的创建视图中,您正在使用TextBoxFor辅助方法,如
Html.TextBoxFor(model => model.ProductBrand.Name)
这将生成名为“ProductBrand.Name
”
<input name="ProductBrand.Name" type="text" value="" /> .
但在您的HttpPost操作中,参数的类型为ProductBrandViewModel
,其名称ProductBrand.Name
没有任何问题。
解决方案是从
更改HttpPost操作的参数类型public ActionResult Create(ProductBrandViewModel brand)
{}
到
public ActionResult Create(ProductBrandPageViewModel brand)
{}
或更新您的视图以使输入字段生成字段名称Name
而不是ProductBrand.Name
答案 1 :(得分:0)
所以我想通了,因为表单生成一个输入字段为ProductBrand.Name
,使用brand
作为参数将不起作用,因为它没有带ProductBrand.Name
的属性,通过将参数名称从brand
更改为productBrand
,MVC能够匹配该名称并能够正确地为Name属性赋值。
这正是我的“分类”操作有效的原因,因为参数名称为productCategory
而不仅仅是category
。