使用ViewBag传递模型对象

时间:2012-12-05 05:49:34

标签: 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>
}

我的SearchResult视图:

@model IEnumerable<Cars.Models.Car>

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

我的模特:

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

我的控制器:

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

        return View();
    }

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

现在有趣的部分是,当我分别用CarFilter filters和其他地方替换String carMake时。它就像一个魅力。

我的问题:

  • 为什么?

  • 如何使用CarFilter filters

  • 执行此操作

更新:

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

第二次更新:

我尝试使用filters = ViewBag.CurrentFilters更改CarFilter = ViewBag.CurrentFilters。现在我控制器中CarFilter filters方法中的SearchResult(...)不是null对象,但模型类中对象的所有值都是null(不应该是)。我的意思是过滤器对象存在,但似乎我的模型中的CarFilter类的值没有被ViewBag.CurrentFilters传递给视图。

1 个答案:

答案 0 :(得分:0)

当你运用它起作用的名称时,因为框架找到了属性名称并将其绑定到动作参数中的内容并不能很好地处理对象。我的建议是坚持使用简单类型

以下是类似的案例: How to send model object in Html.RenderAction (MVC3)

一般来说,它不是一个ViewBag问题。它是使用扁平模型的主要原因:/