C# 传递null ViewModel的操作后处理
我知道这个问题已经被问和回答了十几次了,但没有一个解决方案对我有帮助 我有一个下面的视图模型,它由ProductDetail数据模型和Product_ProductCategoryAttribute数据模型列表组成C# 传递null ViewModel的操作后处理,c#,asp.net,asp.net-mvc,razor,viewmodel,C#,Asp.net,Asp.net Mvc,Razor,Viewmodel,我知道这个问题已经被问和回答了十几次了,但没有一个解决方案对我有帮助 我有一个下面的视图模型,它由ProductDetail数据模型和Product_ProductCategoryAttribute数据模型列表组成 public class ProductDetailViewModel { public ProductDetail ProductDetail { get; set; } public List<Product_ProductCategoryAttribute
public class ProductDetailViewModel
{
public ProductDetail ProductDetail { get; set; }
public List<Product_ProductCategoryAttribute> Product_ProductCategoryAttribute { get; set; }
}
然而,由于我相信潜在的问题在视图中的某个地方,我将添加视图代码片段
@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.BeginForm(“编辑”、“产品详细信息”、FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model=>model.ProductDetail.idProductDetail)
@LabelFor(model=>model.ProductDetail.Name,htmlAttributes:new{@class=“controllabel col-md-2”})
@TextBoxFor(model=>model.ProductDetail.Name,new{htmlAttributes=new{@class=“form control”}})
@LabelFor(model=>model.ProductDetail.Description,htmlAttributes:new{@class=“controllabel col-md-2”})
@TextBoxFor(model=>model.ProductDetail.Description,new{htmlAttributes=new{@class=“form control”})
@对于(int i=0;imodel.Product_ProductCategoryAttribute[i].Value,新{@class=“form control”})
}
}
从上面的视图生成的HTML如下所示(为了简洁起见,对某些部分进行了编辑):
名称
描述
韦利奇纳
什里纳
帕基兰杰
我不确定命名约定是否有问题,但我敢打赌。问题在于自动生成的控制器编辑操作中添加了两个[Bind(Include=”“)]属性,这些属性是错误的,阻止数据发布到服务器 正确的代码段如下所示:
[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);
}
您发回的方法是什么?@StephenMuecke它确实是基本的-它(还)不做任何事情,但接受ProductDetailViewModel显示它。控件的名称正确,因此错误在控制器方法中。可能有很多原因,但最好的猜测是您已将参数命名为与模型属性之一相同的名称。@StephenMuecke即使在过去两天中我一直在处理这个问题,但我发现了问题所在。自动生成的[Bind(Include=”“)]-将编辑帖子。您是对的-控制器是问题所在。@StephenMuecke已经完成;)
<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>
[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);
}