我是桌面新手。
我有两种型号。
首先
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....");
}
});
});
});
答案 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
的操作方法。然后,默认活页夹将尝试查找chkCategory
和Name
属性,以查看操作是否接受它们。它找不到它。然后,它会尝试查看它是否可以创建ProductsVM
而它不能,因为ProductsVM
有2个属性:items
和categories
并且它们与您发布的内容不匹配它只会选择该动作并将其传递为null。
您的代码中存在许多问题,而且整个MVC框架并没有很好地发挥作用。我建议你阅读Understanding MVC Model Binding并尝试一些简单的例子来了解它,然后尝试你正在做的事情。