使用ViewBag传递模型对象

Ami*_* Z. 5 c# asp.net-mvc-3

我正在尝试对结果页面进行排序(这是在过滤页面之外的另一个视图中).我遇到了这个奇怪的问题,我不明白为什么一直发生在我身上.

所有代码都以非常简短的形式提供,如果您需要我的代码的任何其他部分以获取更多信息,请询问我.

我的索引视图(用户筛选结果的位置):

@model IEnumerable<Cars.Models.CarSearch>
@using (Html.BeginForm("SearchResult", "Home", FormMethod.Post,
    new
    {
        id = "CategoryFormID",
        data_modelListAction = @Url.Action("ModelList"),
        data_makeListAction = @Url.Action("MakeList"),
        data_editionListAction = @Url.Action("EditionList")
    }))
{
<label>Make</label>
<select id="MakeID" name="carMake">
    <option>All Makes</option>
</select>
}
Run Code Online (Sandbox Code Playgroud)

我的SearchResult视图:

@model IEnumerable<Cars.Models.Car>

<a href="@Url.Action("SearchResult", "Home", new { sortOrder= "Make", filters = ViewBag.CurrentFilters})">Make</a>
Run Code Online (Sandbox Code Playgroud)

我的模特:

public class Car
{
    public String Make { get; set; }      //is my table model
}

public class CarFilter {
    public String carMake { get; set; }
}

public class CarSearch {
    public CarFilter CarFilter { get; set; }
    public byte PageSize { get; set; }
    public short PageNumber { get; set; }
    public int TotalRows { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器:

public ActionResult SearchResult(String sortOrder, CarFilter filters)
    {
        ViewBag.CurrentFilters = filters;

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

我所要做的就是将CarMake从Index发布到CarFilter形式的控制器(因为在我的代码中,表单中有很多字段,我不想把它们全部写下来),当用户点击时通过Make it GET获取SearchResult方法,它应该设置filters = ViewBag.CurrentFilters哪个是用户从头开始输入的值.

现在,有趣的是,当我更换CarFilter filtersString carMake分别等地.它就像一个魅力.

我的问题:

  • 为什么?

  • 我怎么能这样做CarFilter filters

更新:

问题是filters = ViewBag.CurrentFilters在我的SearchResult视图中不适用于该类型CarFilter,因为当用户单击按Make排序时,它会一直给我NULL值.

第二次更新:

我试图改变filters = ViewBag.CurrentFiltersCarFilter = ViewBag.CurrentFilters.现在CarFilter filtersSearchResult(...)在我的控制器方法是不是和空对象,但在模型类对象的所有值是零(这应该不是).我的意思是过滤器对象存在,但似乎我的模型中的CarFilter类的值尚未传递ViewBag.CurrentFilters给视图.

小智 0

当您更改名称时,它会起作用,因为框架找到了属性名称,并将其绑定到操作参数中的内容对于对象来说效果不佳。我的建议是坚持使用简单类型

这是类似的情况: How to send model object in Html.RenderAction (MVC3)

这不是 ViewBag 的问题,而是它一般如何工作的问题。这是使用扁平模型的主要原因:/