Post 表单总是返回 null

Post form always returning null

我在 asp .net mvc 4 中有一个应用程序如下:

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>

每当我导航到 http://localhost:5858/Products/Products 并单击并提交时,控件会在 Products 方法中变为 [HttpPost],但模型始终为空。

我在这里缺少什么?我希望在加载页面时返回相同的模型,为什么模型变空了?

模型为空,因为您的表单不包含除搜索框以外的任何输入元素:

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

所以唯一发送到服务器的是在此搜索框中输入的值。您不可能期望在 Post 操作中获得 List<Product>。由于客户端不应该修改此信息,因此您所要做的就是在 POST 操作中检索此列表,就像您在 GET 操作中所做的那样:

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