2013-12-12 239 views
1

我有一个模型:ASP.NET MVC模型绑定 - 嵌套属性

public class DataModel 
{ 
    public GridSortOptions SortOptions { get; set; } 
    public string Term { get; set; } 
    public int? Page { get; set; } 
    ... 
} 

public class GridSortOptions 
{ 
    public string Column { get; set; } 
    public SortDirection Direction { get; set; } 
} 

,并将HTTP请求:?Column=LastName&Direction=Descending

该请求将无法正常工作,我需要更新如下:?SortOptions.Column=LastName&SortOptions.Direction=Descending

是否有可能教ASP.NET无需更改模型即可了解原始请求?

PS。我知道我可以创建一个自定义绑定,但我觉得有一个简单的方法存在...

在此先感谢!

+0

什么是您视图看起来像,并且你使用MVC contrib? –

回答

0

我有我的结构略有不同,因为我遇到了同样的问题(在MVC1,现在仍然有 - mvc4)。我经常发现嵌套模型往往会导致头痛和不必要的复杂性,所以我尽可能地平整视图模型,以简化事情,所以不必编写自定义模型绑定器,节省大量时间和代码。

我的行动通常如下方法看起来像这样

//...snip 
public ActionResult List(int? page, GridSortOptions sortOptions, string keyword) { 
     var model = new UserGridViewModel(); 
     IQueryable<User> users = new UserRepository(Session).List(); 
     if (sortOptions.Column != null) { 
      users = users.OrderBy(sortOptions.Column, sortOptions.Direction); 
     } 

     if (keyword != null) { 
      users = users.Where(x => x.Name.Contains(keyword)) 
     } 

     model.SortOptions = sortOptions; 

     //using MvcContrib.Pagination.PaginationHelper here 
     model.Results = users.AsPagination(page ?? 1, 20); 
     return View(model); 
} 
//..... 

我的观点的逻辑无非是:

@using MvcContrib.UI.Grid 
@using MvcContrib.UI.Pager 
@model UsersGridViewModel 

@Html.Grid(Model.Results).Columns(cols => { 
           cols.For(col => col.Id).Sortable(true); 
           cols.For(col => col.Name).Sortable(true); 
           //...etc 
          }).Sort(Model.SortOptions) 

我格视图模型通常是这样的:

public class UserGridViewModel 
{ 
    public IPagination<User> Results { get; set; } 
    public GridSortOptions SortOptions { get; set; } 
} 
+0

谢谢,它现在是如何工作的。但是我的行为有很多参数,比如术语,不同的过滤器,页面和网格的一些状态。将它包装在一个对象中会更好。 –

+0

我在这里简化了我的例子,我的项目,我有一个网格模型的接口,以及一组具有通用方法的通用抽象基类,它们可以“自动”处理网格视图的一些常用逻辑,但是,有点复杂。你能给我一个例子或你典型的行动吗? –