Calling httppost actionresult from inside a view using a button

后端 未结 1 1609
隐瞒了意图╮
隐瞒了意图╮ 2021-01-23 23:49

I have a project to make an online shop between users (post a product, buy, etc.) using a database. In this project I have a view called \"ShoppingCart\":

@model         


        
相关标签:
1条回答
  • 2021-01-24 00:14

    If you wan't to post any data from a view to an action method, you should keep that data in form elements and keep that in a form. Since you want to post a collection of items, You may use Editor Templates.

    Let's start by creating a view model.

    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; }
    }
    

    Now in your GET action, you will create an object of the ShoppingCartViewModel, load the CartItems property and send to the view.

    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);
    }
    

    Now i will create an EditorTemplate. To do that, Go to your ~/Views/YourControllerName folder, and Create a directory called EditorTemplates and add a view with name Product.cshtml

    The name of the file should match with the name of the type.

    Open this new view and add the below code.

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

    You can keep the display however you want. But the important thing is, We need to keep a form field for the productId. We are keeping that in a hidden field here.

    Now let's go back to our main view. We need to make this view strongly typed to our ShoppingCartViewModel. We will use the EditorFor html helper method in this view to call our editor template

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

    And in your HttpPost action method, We will have a paramer of type ShoppingCartViewModel. When the form is submitted, MVC Model binder will map the posted form values to an object of 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");
    }
    

    You can iterate through the CartItems collection and get the Id of the Products and do whatever you want.

    If you wan't to allow the user to edit the items (using a check box) in this page, Take a look at this answer. It is basically same, but you add a boolean property to Product class and use that for rendering a checkbox.

    0 讨论(0)
提交回复
热议问题