POST操作传递null ViewModel [英] POST action passing null ViewModel
问题描述
我知道这个问题已经被回答了十多次,但是没有一个解决方案对我有帮助.
我有一个以下ViewModel,它由ProductDetail数据模型和一个Product_ProductCategoryAttribute数据模型列表组成.
公共类ProductDetailViewModel{public ProductDetail ProductDetail {get;放;}公共列表< Product_ProductCategoryAttribute>Product_ProductCategoryAttribute {get;放;}}
在执行操作回发时,我收到一个空的ViewModel.
[HttpPost][ValidateAntiForgeryToken]公共ActionResult编辑([绑定(包括="idProductDetail,idProductCategory,idProduct,Name,Description")] ProductDetailViewModel productDetailAll){如果(ModelState.IsValid){ProductDetail productDetail = productDetailAll.ProductDetail;db.Entry(productDetail).State = EntityState.Modified;db.SaveChanges();返回RedirectToAction("Index");}返回View(productDetailAll);}
但是,由于我认为潜在的问题在视图内某个地方,因此我将添加视图代码段.
@using(Html.BeginForm("Edit","ProductDetail",FormMethod.Post)){@ Html.AntiForgeryToken()< div class ="form-horizontal">@ Html.HiddenFor(模型=>模型.ProductDetail.idProductDetail)< div class ="form-group">@ Html.LabelFor(model => model.ProductDetail.Name,htmlAttributes:new {@class ="control-label col-md-2"})< div class ="col-md-10">@ Html.TextBoxFor(model => model.ProductDetail.Name,new {htmlAttributes = new {@class ="form-control"}})</div></div>< div class ="form-group">@ Html.LabelFor(model => model.ProductDetail.Description,htmlAttributes:new {@class ="control-label col-md-2"})< div class ="col-md-10">@ Html.TextBoxFor(model => model.ProductDetail.Description,new {htmlAttributes = new {@class ="form-control"}})</div></div>@for(int i = 0; i< Model.Product_ProductCategoryAttribute.Count(); i ++){< div class ="form-group">< label class ="control-label col-md-2"> @ Model.Product_ProductCategoryAttribute [i] .ProductCategoryAttribute.Name</label>< div class ="col-md-5">@ Html.TextBoxFor(model => model.Product_ProductCategoryAttribute [i] .Value,新的{@class ="form-control"})</div></div>}< div class ="form-group">< div class ="col-md-offset-2 col-md-10"><输入类型=提交" value =保存" class ="btn btn-sm btn-default"/></div></div></div>}
从上面的视图生成的HTML如下(为简洁起见,省略了某些部分):
<前置>J8IHBiKT4ApvR3cSLbhw_AntbibEFsD68eUkc1"/>< input data-val ="true" data-val-number =字段idProductDetail必须为数字."data-val-required =" idProductDetail字段为必填."id ="ProductDetail_idProductDetail" name ="ProductDetail.idProductDetail" type ="hidden" value ="4"/>< div class ="form-group">< label class ="control-label col-md-2" for ="ProductDetail_Name"> Name</label>< div class ="col-md-10">< input htmlAttributes ="{class = form-control}" id ="ProductDetail_Name" name ="ProductDetail.Name" type ="text" value =Čipkai hiljadušara"/></div></div>< div class ="form-group">< label class ="control-label col-md-2" for ="ProductDetail_Description">说明</label>< div class ="col-md-10">< input htmlAttributes ="{class = form-control}" id ="ProductDetail_Description" name ="ProductDetail.Description" type ="text" value =Šipkaičipka"/></div></div>< div class ="form-group">< label class ="control-label col-md-2">Veličina</label>< div class ="col-md-5">< input class ="form-control" id ="Product_ProductCategoryAttribute_0__Value" name ="Product_ProductCategoryAttribute [0] .Value" type ="text" value ="/></div></div>< div class ="form-group">< label class ="control-label col-md-2">Širina</label>< div class ="col-md-5">< input class ="form-control" id ="Product_ProductCategoryAttribute_1__Value" name ="Product_ProductCategoryAttribute [1] .Value" type ="text" value ="/></div></div>< div class ="form-group">< label class ="control-label col-md-2"> Pakiranje</label>< div class ="col-md-5">< input class ="form-control" id ="Product_ProductCategoryAttribute_2__Value" name ="Product_ProductCategoryAttribute [2] .Value" type ="text" value ="/></div></div>< div class ="form-group">< div class ="col-md-offset-2 col-md-10"><输入类型=提交" value =保存" class ="btn btn-sm btn-default"/></div></div></div>
我不确定命名约定是否有问题,但是我敢打赌.
问题出在自动生成的控制器编辑"操作中,该操作添加了两个错误的 [Bind(Include =")] 属性.阻止将数据发布到服务器.
正确的代码段如下所示:
[HttpPost][ValidateAntiForgeryToken]公共ActionResult编辑(ProductDetailViewModel productDetailAll){如果(ModelState.IsValid){ProductDetail productDetail = productDetailAll.ProductDetail;db.Entry(productDetail).State = EntityState.Modified;db.SaveChanges();返回RedirectToAction("Index");}返回View(productDetailAll);}
I know this question has been asked and answered a dozen of times but none of the solutions help me.
I have a following ViewModel which is consisted of ProductDetail data model and a list of Product_ProductCategoryAttribute data model.
public class ProductDetailViewModel
{
public ProductDetail ProductDetail { get; set; }
public List<Product_ProductCategoryAttribute> Product_ProductCategoryAttribute { get; set; }
}
On an action postback I receive an empty ViewModel.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "idProductDetail,idProductCategory,idProduct,Name,Description")] ProductDetailViewModel productDetailAll)
{
if (ModelState.IsValid)
{
ProductDetail productDetail = productDetailAll.ProductDetail;
db.Entry(productDetail).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(productDetailAll);
}
However, as I believe that the underlying problem is somewhere within the view I will add the view code snippet.
@using (Html.BeginForm("Edit", "ProductDetail", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.HiddenFor(model => model.ProductDetail.idProductDetail)
<div class="form-group">
@Html.LabelFor(model => model.ProductDetail.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.ProductDetail.Name, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ProductDetail.Description, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.ProductDetail.Description, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
@for (int i = 0; i < Model.Product_ProductCategoryAttribute.Count(); i++)
{
<div class="form-group">
<label class="control-label col-md-2">@Model.Product_ProductCategoryAttribute[i].ProductCategoryAttribute.Name</label>
<div class="col-md-5">
@Html.TextBoxFor(model => model.Product_ProductCategoryAttribute[i].Value, new { @class = "form-control" })
</div>
</div>
}
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-sm btn-default" />
</div>
</div>
</div>
}
HTML generated from the view above is as follows (some parts are ommited for brevity):
<form action="/Administration/ProductDetail/Edit/4" method="post"><input name="__RequestVerificationToken" type="hidden" value="IS4fstTTjOD4d9FEzyM5yWlvO9xqlOq_AHFx_8_vC079F1iDvucf5wgRIgV4iXH-NGU-u-J8IHBiKT4ApvR3cSLbhw_AntbibEFsD68eUkc1" />
<input data-val="true" data-val-number="The field idProductDetail must be a number." data-val-required="The idProductDetail field is required." id="ProductDetail_idProductDetail" name="ProductDetail.idProductDetail" type="hidden" value="4" />
<div class="form-group">
<label class="control-label col-md-2" for="ProductDetail_Name">Name</label>
<div class="col-md-10">
<input htmlAttributes="{ class = form-control }" id="ProductDetail_Name" name="ProductDetail.Name" type="text" value="Čipka i hiljadu šara" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="ProductDetail_Description">Description</label>
<div class="col-md-10">
<input htmlAttributes="{ class = form-control }" id="ProductDetail_Description" name="ProductDetail.Description" type="text" value="Šipka i čipka" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2">Veličina</label>
<div class="col-md-5">
<input class="form-control" id="Product_ProductCategoryAttribute_0__Value" name="Product_ProductCategoryAttribute[0].Value" type="text" value="" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2">Širina</label>
<div class="col-md-5">
<input class="form-control" id="Product_ProductCategoryAttribute_1__Value" name="Product_ProductCategoryAttribute[1].Value" type="text" value="" />
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2">Pakiranje</label>
<div class="col-md-5">
<input class="form-control" id="Product_ProductCategoryAttribute_2__Value" name="Product_ProductCategoryAttribute[2].Value" type="text" value="" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-sm btn-default" />
</div>
</div>
</div>
I'm not sure if something is wrong with the naming convention but my bet would be on that.
The problem was in autogenerated controller Edit action which added couple of [Bind(Include="")] attributes which were wrong and which were preventing data to be posted to the server.
Correct snippet would look like this:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit (ProductDetailViewModel productDetailAll)
{
if (ModelState.IsValid)
{
ProductDetail productDetail = productDetailAll.ProductDetail;
db.Entry(productDetail).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(productDetailAll);
}
这篇关于POST操作传递null ViewModel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!