我目前正在研究一个相当简单的MVC应用程序,它允许用户输入一些搜索数据,获取结果列表,然后查看每个项目等等。这一切都很顺利,但我现在正试图实现寻呼,但遇到了一些麻烦。
我的搜索表单使用HTTP GET,请求执行以下操作:
public ActionResult Results(PropertySearchData data, int? page)
{
...
IEnumerable<Property> search = mService.SearchProperties(data);
ViewData["SearchData"] = data;
return View("Results", "Site", search.ToPagedList(page ?? 0, 20));
...
}
从这里我构建了我传递到视图中的IEnumerable集合的结果表。另外,我使用ViewData来保存搜索参数,以便在用户请求不同的页面时我可以传递它们。
例如,要进入第一页,我想使用以下内容:
Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 })
但是,当生成此链接时,我的链接就是
/Results?data=PropertySearchData&page=1
如果我完全删除'page'参数,只是将ViewData [“SearchData”]作为我的路由值传递,我的链接会生成我想要的方式(即PropertySearchData的每个成员都作为查询字符串传递模型绑定功能。我猜这是因为模型绑定只能在指定单个类型时才能正常工作?
我可以看到为什么这不起作用的几个原因;我遇到麻烦的是找出“好”的方式去做我想做的事情。我知道我必须在这里缺乏一个重要的理解,所以如果我能得到一些关于如何处理它的指示,我将不胜感激。
请注意,我真的想坚持使用HTTP GET(因为这是一个搜索结果页面)。
谢谢!
答案 0 :(得分:2)
由于data
或ViewData["SearchData"]
是PropertySearchData
的实例,我猜测Html.ActionLink
正在调用ToString()
并且没有给出结果期望的。
答案 1 :(得分:2)
问题是帮助方法只是尝试从你给它的东西中生成一些东西,这是一个有两个属性的对象:数据和页面。
要获取页码,你可以使用一个路由值字典(这可能是在引擎盖下完成的),并使用接受IDictionary的覆盖: -
//In some HtmlHelper extension method or something
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]);
searchCriteria.Add("page", 1);
return Html.ActionLink("First", "Results", searchCriteria)
答案 2 :(得分:1)
创建HtmlHelper扩展方法不是解决此问题的最佳方法。它不会增加一般功能,只会增加(视觉)混乱......
Html.ActionLink的routeValues重载需要一个对象或RouteValueCollection(IDictionary)。您现在正在使用对象重载(因为新的{}构造函数是一个匿名对象)。
您可以使用以下命令创建正确的routeValues参数:
new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }
这会使用当前搜索数据初始化新的RouteValueCollection,然后使用新值添加“page”键(如果搜索数据中存在,则覆盖它)。