使用按钮从视图内部调用httppost actionresult

时间:2015-12-18 22:38:36

标签: c# asp.net-mvc view actionresult

我有一个项目,使用数据库在用户之间进行在线商店(发布产品,购买等)。在这个项目中,我有一个名为“ShoppingCart”的视图:

@model IEnumerable<MyFirstProject.Models.Product>

@{
    ViewBag.Title = "ShoppingCart";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Your Shopping Cart</h2>



@if (Model == null)
{
    <div style="float:left">Your cart is empty.</div>
    <div>
        Total payment: 0
    </div>
}
else
{
    decimal tPrice = 0;
    <div>
    <table style="float:left">
        @foreach (var product in Model)
        {
            tPrice = tPrice + product.Price;
            { Html.RenderPartial("ProductLine", product);}
        }
    </table>
        </div>
    <div>
        Total payment: @tPrice
    </div>
}

它会收到用户决定购买并显示的产品列表(不是重要部分)。我需要添加一个按钮,将列表发送到“ShoppingController”中的操作结果:

[HttpPost]
        public ActionResult ShoppingCart(List<Product> bought)
        {
            if (ModelState.IsValid)
            {
                foreach (var listP in bought.ToList())
                {
                    foreach (var databaseP in db.Products.ToList())
                    {
                        if (listP.ProductID == databaseP.ProductID)
                        {
                            databaseP.State = 1;
                            db.SaveChanges();
                            break;
                        }
                    }
                }
                return RedirectToAction("Index");
            }

            else
            {
                return View(bought);
            }
        }

“State”表示产品是否被购买(0 =未购买,1 =购买),db是数据库

1 个答案:

答案 0 :(得分:0)

如果您不想将视图中的任何数据发布到操作方法,则应将这些数据保存在表单元素中并将其保留在表单中。由于您要发布项目集合,因此您可以使用编辑器模板

让我们从创建视图模型开始。

public class ShoppingCartViewModel
{
    public decimal TotalPrice { set; get; }
    public List<Product> CartItems { set; get; }
}

public class Product
{
    public int Id { set; get; }
    public string Name { set; get; }
}

现在,在您的GET操作中,您将创建ShoppingCartViewModel的对象,加载CartItems属性并发送到视图。

public ActionResult Index()
{
    var cart = new ShoppingCartViewModel
    {
        CartItems = new List<Product>
        {
            new Product   { Id = 1, Name = "Iphone" },
            new Product   { Id = 3, Name = "MacBookPro" }
        },
        TotalPrice = 3234.95
    };
    return View(cart);
}

现在我将创建一个EditorTemplate。为此,请转到~/Views/YourControllerName文件夹,然后创建名为EditorTemplates的目录,并添加名称为Product.cshtml的视图

该文件的名称应与该类型的名称相匹配。

enter image description here

打开此新视图并添加以下代码。

@model YourNamespace.Product
<div>
    <h4>@Model.Name</h4>
    @Html.HiddenFor(s=>s.Id)
</div>

您可以随意保留显示。但重要的是,我们需要为productId保留一个表单字段。我们将它保存在一个隐蔽的领域。

现在让我们回到主视图。我们需要将此视图强烈输入到ShoppingCartViewModel。我们将在此视图中使用EditorFor html辅助方法来调用我们的编辑器模板

@model ReplaceYourNamespaceHere.ShoppingCartViewModel
@using (Html.BeginForm())
{       
    @Html.EditorFor(x => x.CartItems)
    <p>Total : @Model.TotalPrice</p>
    <input type="submit" />
}

在你的HttpPost动作方法中,我们将有一个ShoppingCartViewModel类型的游侠。提交表单时,MVC Model binder会将发布的表单值映射到ShoppingCartViewModel的对象。

[HttpPost]
public ActionResult Index(ShoppingCartViewModel model)
{
    foreach (var item in model.CartItems)
    {
        var productId = item.Id;
        // to do  : Use productId and do something
    }
    return RedirectToAction("OrderSucessful");
}

您可以遍历CartItems集合并获取产品的ID并执行任何操作。

enter image description here

如果您不允许用户在此页面中编辑项目(使用复选框),请查看this answer。它基本相同,但您向Product类添加一个布尔属性,并使用它来渲染复选框。