【问题标题】:MVC Razor, How to keep Model object between ActionsMVC Razor,如何在动作之间保留模型对象
【发布时间】:2016-04-06 16:55:23
【问题描述】:

我正在尝试显示产品库存清单。 我想让用户有一个选项来编辑数量和从这个列表中删除产品的能力。问题是,模型对象在提交操作后消失了。我想保留它,以便以后更新数据库中的库存。

控制器:

    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>

顺便说一句,只有这个原始:@Html.EditorFor 保留返回数据的值。 但我想避免将@Html.EditorFor 用于其他字段,而 保留这些字段数据。

非常感谢您的帮助(:

【问题讨论】:

  • 对不起!我很难理解你的问题。你的预期行为是什么,你得到了什么?
  • 是的,但是您对此有何期待?表单的整个模型?
  • 期望将模型数据传递给“SubmitProductsValues”。我得到的是一个空对象,除了数量。
  • 顺便说一句,忽略“@Html.CheckBox("remove")”字段。这不是模型的一部分。 (:

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


【解决方案1】:

因为其他字段值不在表单字段中,所以您得到 null。模型绑定将映射来自表单字段的数据(名称与您的视图模型属性名称匹配)。目前,您仅在 div 中显示名称、价格等,而不是在输入字段中。

但是由于您不想更新任何其他字段,因此您不必担心将其他字段值设为空。您需要的是记录的唯一 ID 和具有表单更新值的 Quantity 字段值。

你也不需要 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
}

【讨论】:

  • 老兄.. 你真棒!那是工作。我需要做的就是按照你的建议添加隐藏的输入。
【解决方案2】:
<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 (:

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多