MVC Razor,如何在Actions之间保留Model对象

时间:2016-01-02 16:33:55

标签: asp.net-mvc razor razor-2

我正在尝试显示产品库存清单。 我想让用户选择编辑数量以及从此列表中删除产品的功能。问题是,在提交操作后,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 保留这些字段数据。

非常感谢你的帮助(:

2 个答案:

答案 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(: