我目前正在研究一个相当简单的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 [&quot; SearchData&quot;]作为我的路由值传递,我的链接会生成我想要的方式(即PropertySearchData的每个成员都作为查询字符串传递通过模型绑定功能。我猜这是因为模型绑定只有在你指定了一个类型时才能正常工作?

我可以看到为什么这不起作用的几个原因;我遇到麻烦的是找出“好”的方式去做我想做的事情。我知道我必须在这里缺乏一个重要的理解,所以如果我能得到一些关于如何处理它的指示,我将不胜感激。

请注意,我真的想坚持使用HTTP GET(因为这是一个搜索结果页面)。

谢谢!

有帮助吗?

解决方案

问题是帮助方法只是尝试从你给它的东西中生成一些东西,这是一个有两个属性的对象:数据和页面。

要获取页码,你可以使用一个路由值字典(这可能是在引擎盖下完成的),并使用接受IDictionary的覆盖: -

//In some HtmlHelper extension method or something 
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]);
searchCriteria.Add("page", 1);

return Html.ActionLink("First", "Results", searchCriteria)

其他提示

由于 data ViewData [&quot; SearchData&quot;] PropertySearchData 的实例,我猜是 Html.ActionLink 正在调用 ToString(),而不是给出你期望的结果。

创建HtmlHelper扩展方法不是解决此问题的最佳方法。它不会增加一般功能,只会增加(视觉)混乱......

Html.ActionLink的routeValues重载需要一个对象或RouteValueCollection(IDictionary)。您现在正在使用对象重载(因为新的{}构造函数是一个匿名对象)。

您可以使用以下命令创建正确的routeValues参数:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }

这会使用当前搜索数据初始化新的RouteValueCollection,然后使用新值添加“page”键(如果搜索数据中存在,则覆盖它)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top