表单POST例程在一个操作上工作,但在以完全相同的方式实现时不工作

时间:2016-06-21 14:59:16

标签: c# asp.net-mvc controller http-post html.beginform

我正在尝试从我的表单向我的控制器操作提交类型为 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">&times;</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; }
}

2 个答案:

答案 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