简体   繁体   中英

Post form always returning null

I have an application in asp .net mvc 4 as follows:

1.ProductsController.cs

namespace MvcApplication2.Controllers
{
    public class ProductsController : Controller
    {
        //
        // GET: /Products/

        [HttpGet]
        public ActionResult Products()
        {
            List<Product> prList = new List<Product>();
            Product p1 = new Product();
            p1.ProductName = "J & J";
            p1.Price = 40;
            p1.Ratings = 5;
            prList.Add(p1);
            Product p2 =  new Product();
            p2.ProductName = "Himalaya";
            p2.Price = 20;
            p2.Ratings = 2;
            prList.Add(p2);
            return View(prList);

        }

        [HttpPost]
        public ActionResult Products(FormCollection prList,List<MvcApplication2.Models.Product> fg) 
        {
            return View(prList);
        }

    }
}

2. ProductList.cs

namespace MvcApplication2.Models
{


    public class Product
    {
        public string ProductName { get; set; }
        public int Price { get; set; }
        public int Ratings { get; set; }
    }

}

3. Products.cshtml

@{
    Layout = null;

}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Products</title>
    @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")

    <script src="~/Scripts/jquery-3.2.1.min.js"></script>
</head>
@model IEnumerable<MvcApplication2.Models.Product>
@using (@Html.BeginForm("Products", "Products", FormMethod.Post))
{
<body>
    <div style="width:100%;height:100%;position: relative ">
        <div style="width:100%;top:0px;height:40px;position:relative;background-color:purple">
            <input type="submit" value="Sort price" style="float : right;width:30px;" id="SearchId" />
            @Html.TextBox("Search Box", null, new { @style = "float:right;width:80px "});
            <input type="submit" value="submit" />  
        </div>
        <div id="tableDiv">
            <table id="tableId">
                <tr>
                    <th>Name</th>
                    <th>Price in Rs.</th>
                    <th>Ratings</th>
                </tr>
@foreach (var drawing in Model)
{

                <tr>
                    <td>@drawing.ProductName</td>
                    <td>@drawing.Price</td>
                    <td>@drawing.Ratings</td>
                </tr>

}
            </table>
        </div>
    </div>
</body>
}
</html>

Whenever I navigate to http://localhost:5858/Products/Products and click and on submit , the contol comes to [HttpPost] in Products methods, but the model is always empty .

What is it that I am missing here?I am expecting the same model to be returned when the page was loaded , why is it that the model is becoming empty?

The model is empty because your form doesn't contain any input element other than the search box:

@Html.TextBox("Search Box", null, new { @style = "float:right;width:80px "})

So the only thing that gets sent to the server is the value entered in this search box. You cannot possibly expect to get a List<Product> in your Post action. Since this information is not supposed to be modified by the client all you have to do is to retrieve this list in your POST action the same way you did in your GET action:

[HttpGet]
public ActionResult Products()
{
    var prList = this.GetProducts();
    return View(prList);
}

[HttpPost]
public ActionResult Products(FormCollection fc) 
{
    var prList = this.GetProducts();

    // TODO: based on the search parameter sent from the client
    // here you probably want to filter the prList before passing it
    // back to the view

    return View(prList);
}

private List<Product> GetProducts()
{
    List<Product> prList = new List<Product>();
    Product p1 = new Product();
    p1.ProductName = "J & J";
    p1.Price = 40;
    p1.Ratings = 5;
    prList.Add(p1);
    Product p2 =  new Product();
    p2.ProductName = "Himalaya";
    p2.Price = 20;
    p2.Ratings = 2;
    prList.Add(p2);
    return prList;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM