我正在尝试显示产品库存列表。我想让用户可以选择编辑数量,并可以从列表中删除产品。问题是,Model对象在提交操作之后就消失了。我想保留它,以便稍后更新DB中的库存。
控制器:
public ActionResult EditProducts()
{
//! Pulling DATA from db using DbContext
ProductDAL proDAL = new ProductDAL();
List<Products> pl = proDAL.Products.ToList<Products>();
ProductModel productModel = new ProductModel();
productModel.oneProduct = new Products();
productModel.ProductsCollection = new List<Products>();
productModel.ProductsCollection = pl;
TempData["pM"] = productModel;
return View("EditProducts", TempData["pM"]);
}
public ActionResult SubmitProductsValues(ProductModel productModel)
{
//! Some farther work to do...
return View("EditProducts", TempData["pM"]);
}
我的观点:
@using (Html.BeginForm("SubmitProductsValues", "Admin", FormMethod.Post))
{
<div class="col-xs-12 hclearfix edit">
<div class="col-xs-2 eRow et"><b>Product SKU</b></div>
<div class="col-xs-2 eRow et"><b>Product Name</b></div>
<div class="col-xs-2 eRow et"><b>Product Price</b></div>
<div class="col-xs-2 eRow et"><b>Product Quantity</b></div>
<div class="col-xs-2 eRow et"><b>Product Picture</b></div>
<div class="col-xs-1 eRow et"><b>pId</b></div>
<div class="col-xs-1 eRow et"><b>Remove?</b></div>
@{ int i = 0; }
@foreach (Products obj in Model.ProductsCollection)
{
<div class="col-xs-2 eRow">@Html.Raw(obj.SKU)</div>
<div class="col-xs-2 eRow">@Html.Raw(obj.Name)</div>
<div class="col-xs-2 eRow">@Html.Raw(obj.Price)</div>
<div class="col-xs-2 eRow">@Html.EditorFor(m=>m.ProductsCollection[i].Quantity)</div>
<div class="col-xs-2 eRow">@Html.Raw(obj.PicURL)</div>
<div class="col-xs-1 eRow">@Html.Raw(obj.Id)</div>
<div class="col-xs-1 eRow">@Html.CheckBox("remove")</div>
i++;
}
<div class="col-xs-12 eRow">
<p class="left">
<input type="submit" id="btnSubmit" value="Save Changes" />
</p>
<p class="alert-danger right">
@Html.ValidationSummary()
</p>
</div>
</div>
顺便说一句,只有这个raw:@Html.EditorFor保留返回数据的值。但我希望避免在其他字段中使用@Html.EditorFor,同时保留这些字段的数据。
非常感谢您的帮助(:
由于其他字段值不在表单字段中,因此您将获得null。模型绑定将映射表单字段中的数据(的名称与视图模型属性名称匹配)。目前,您只在div中显示Name、Price等,而不是在输入字段中显示。
但由于您不想更新任何其他字段,所以不必担心其他字段值为null。您需要的是记录的唯一Id和数量字段值,该值具有来自表单的更新值。
此外,您不需要TempData。您可以将模型传递给View方法。
public ActionResult EditProducts()
{
var proDAL = new ProductDAL();
List<Products> pl = proDAL.Products.ToList<Products>();
ProductModel productModel = new ProductModel();
productModel.ProductsCollection = new List<Products>();
productModel.ProductsCollection = pl;
return View("EditProducts",productModel);
}
在您的视图中,您需要创建具有与属性名称匹配的名称的输入字段,以便在发布表单时进行模型绑定
@model ProductModel
@using (Html.BeginForm("SubmitProductsValues", "Admin", FormMethod.Post))
{
<h2>Items</h2>
int i = 0;
foreach(var p in Model.Products)
{
<div>@p.Name</div>
<input type="hidden" name="ProductsCollection[@i].Id" value="@p.Id" />
<input type="text" name="ProductsCollection[@i].Quantity" value="@p.Quantity" />
}
<input type="submit" value="Update" />
}
现在,在您的HttpPost中,您将获得ProductsCollection
,其中包含来自用户提交的表单的更新数据。
[HttpPost]
public ActionResult SubmitProductsValues(ProductModel model)
{
// loop through model.ProductsCollection
foreach(var p in Model.ProductsCollection)
{
var q=p.Quantity;
var id=q.Id;
// to do : update quantity of the record for the value in Id variable.
}
// to do : Save and redirect
}
<input type="hidden" name="ProductsCollection[@i].SKU" value="@p.SKU" />
<input type="hidden" name="ProductsCollection[@i].Name" value="@p.Name" />
<input type="hidden" name="ProductsCollection[@i].Price" value="@p.Price" />
<input type="hidden" name="ProductsCollection[@i].PicURL" value="@p.PicURL" />
<input type="hidden" name="ProductsCollection[@i].Id" value="@p.Id" />
感谢@Shyju(: