在Asp.net MVC中查看不返回多个列表

时间:2017-06-14 01:57:34

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

我是桌面新手。

我有两种型号。

首先

    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public double Price { get; set; }
        public double Stock { get; set; }
        public Category Category { get; set; }
        public string ImagePath { get; set; }
}

,第二个是

    public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool isSelected { get; set; }
    }

和一个用于将其传递给我的视图的ViewModel

public class ProductsVM
{
    public IList<Item> items { get; set; }
    public IList<Category> categories { get; set; }

}

我的控制器操作方法如下所示

    [HttpGet]
    public ActionResult Products()
    {
        ViewBag.Message = "...Products...";

        ProductsVM productsVm = new ProductsVM();
        productsVm.items = db.Items.ToList();
        productsVm.categories = db.Categories.ToList();
        return View(productsVm);
    }

    [HttpPost]
    public ActionResult Products(ProductsVM model)
    {
        ViewBag.Message = "...Categories...";



        return View(model);
    }

我在我的视图中使用过它

    @using (Html.BeginForm())
    {
        <div class="row">
            <div class="col-md-2">
                @foreach (var it in Model.categories.ToList())
                {
                    <div class="input-group">
                        @Html.CheckBoxFor(i => it.isSelected, new { Name =         "ChkCategory", id = "ChkCategory"+it.Id, @class = "Categories" }) @it.Name
                        @Html.HiddenFor(i => it.Name)

                    </div>
                }
            </div>

            @*Loading Items...*@
            <div class="col-md-10">
                @for (int i = 0; i < Model.items.Count() / 3; i++)
                {
                    <div class="row">
                   @foreach (var item in Model.items.Skip(i *         3).Take(3))
                {
                    <div class="col-md-4 col-sm-6 col-xs-12">
                        <img src="@Url.Content(item.ImagePath)" alt="@item.Description" class="thumbnail" />
                    </div>
                }
            </div>
        }
            </div>
        </div>
        <input type="submit" value="submit" />
    }


    @section scripts
    {
        <script src="~/Scripts/Products.js"></script>
    }

当我将from发布到控制器

时,我已经尝试了所有方法来恢复我的模型

我使用my products.js文件中的ajax发布了来自复选框点击事件。

但是在我的控制器操作方法中,它始终将ViewModel显示为null。

我该怎么办?我做错了什么。

Products.js

    $(function () {
        console.log('Inside js......');
        $('.Categories').click(function (e) {
            console.log(this.id, $("#" + this.id).is(":checked"));
            $.ajax({
                type: "POST",
                url: "/Home/Products",
                success: function () {
                    console.log("ajax successfull....");
                },
                error: function () {
                    console.log("ajax error....");
                }
            });
        });

    });

1 个答案:

答案 0 :(得分:1)

这是您的ProductsVM

public class ProductsVM
{
    public IList<Item> items { get; set; }
    public IList<Category> categories { get; set; }
}

这是您要发布的操作方法:

[HttpPost]
public ActionResult Products(ProductsVM model)

当您提交表单时,它会获取表单控件中的值并使用控件的名称,它会将它们发布到Products操作。在您的视图(表单)中,您有一个名为chkCategory的复选框和一个名为Name的隐藏输入。当您发布表单时,它会发送chkCategory及其值以及名为Name的隐藏项。当它到达服务器端时,MVC将在您的控制器中查找名为Products的操作方法。然后,默认活页夹将尝试查找chkCategoryName属性,以查看操作是否接受它们。它找不到它。然后,它会尝试查看它是否可以创建ProductsVM而它不能,因为ProductsVM有2个属性:itemscategories并且它们与您发布的内容不匹配它只会选择该动作并将其传递为null。

您的代码中存在许多问题,而且整个MVC框架并没有很好地发挥作用。我建议你阅读Understanding MVC Model Binding并尝试一些简单的例子来了解它,然后尝试你正在做的事情。