MVC Razor,如何在操作之间保持Model对象



我正在尝试显示产品库存列表。我想让用户可以选择编辑数量,并可以从列表中删除产品。问题是,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(:

最新更新