我正在尝试显示产品库存清单。 我想让用户选择编辑数量以及从此列表中删除产品的功能。问题是,在提交操作后,Model对象消失了。我想保留它,以便稍后更新数据库中的库存。
控制器:
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>
BTW,只有这个原始:@ Html.EditorFor保留返回数据的值。 但我想避免在其他字段中使用@ Html.EditorFor 保留这些字段数据。
非常感谢你的帮助(:
答案 0 :(得分:1)
您将获得null,因为其他字段值不在表单字段中。模型绑定将映射表单字段中的数据(,其名称与您的视图模型属性名称匹配)。目前,您只在div中显示名称,价格等,而不是输入字段。
但是,由于您不想更新任何其他字段,因此您不必担心将其他字段值设置为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
}
答案 1 :(得分:0)
<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(: