ASP.NET MVC模型绑定 - 嵌套属性

时间:2013-12-12 17:08:34

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有一个模特:

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。我知道我可以创建一个自定义活页夹,但我觉得存在一种非常简单的方式...

提前致谢!

1 个答案:

答案 0 :(得分: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; }
}