2017-06-14 29 views
0

我是从桌面网络新手。查看不返回多个列表在Asp.net MVC

我有两个模型。

第一

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

并把它传递给我的视图

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

} 

一个ViewModel和我的控制器的操作方法是这样的

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

我已经尝试了所有让我的模型回来时,我从到控制器发布方式

我是从上复选框点击张贴使用我的products.js文件中的ajax事件。

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

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

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

显示您Products.js –

+0

烨如果你表现出你的products.js它将有助于我们debug.thanks –

+0

除了重复数据删除(您不能使用'foreach'循环,不要试图改变'名字'属性。 –

回答

0

这是您的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有两个属性:itemscategories并且它们与您发布的内容不匹配,所以只会选择该操作并将其传递为null。

你在代码中有很多问题,并且它不能很好地与整个MVC框架一起玩。我建议你阅读Understanding MVC Model Binding并尝试一些简单的例子来获得它的一个挂钩,然后尝试你在做什么。