如何为此ActionLink创建正确的路径值?

时间:2009-11-27 18:15:23

标签: c# asp.net-mvc actionlink routevalues

SearchResults.aspx的模型是PersonSearch的一个实例;当新页面的请求到达时(GET请求),操作方法应该接受并计算新结果。

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult SearchResults(PersonSearch search, int? page)
{
    ViewData["Results"] = new PaginatedList<Person>(_searchService.FindPersons(search), page ?? 0, 1);
    return View("SearchResults", search);
}

然后我必须生成上一个/下一个链接:

<%= Html.ActionLink("Next Page >", "SearchResults", routeValues) %>

如果我使用routeValues = ViewData.Model我可以看到对象属性传递了地址,但我无法添加“page”参数。

5 个答案:

答案 0 :(得分:24)

它认为最好使用正确的值创建另一个对象,而不是使用(并可能改变当前的路由值):

<%=Html.ActionLink("Next Page >", "SearchResults", new {
    search = this.Model,
    page = 1 //or whatever
}) %>

答案 1 :(得分:6)

Scott Guthrie撰写的这篇博文帮助我了解了URL路由:ASP.NET MVC Framework (Part 2): URL Routing

enter image description here enter image description here

我喜欢他包含测试用例! enter image description here

答案 2 :(得分:3)

您需要覆盖ToString()。

答案 3 :(得分:2)

如果你正在使用Razor(我发现OP在四年前发明Razor之前就已经问过了,但人们发现它可能正在使用它)。

我能够使用内联的@helper方法获得一些工作。

@helper RunnerLink(PersonSearch model, int page)
{
    var routeParms =new RouteValueDictionary(model.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(model, null)));
    routeParms.Add("page", page.ToString());
    routeParms.Add("Controller", "Property");
    @Html.ActionLink("Search", "Index", routeParms)
}

用法很简单 -

@RunnerLink(myPersonSearchInstance, 1)

它不是最优雅的解决方案,但如果您想要将对象作为routeValue传递,但是您需要传递其他项目,例如Controller,{{1} }或在OP案例中Area

答案 4 :(得分:1)

您需要使用RouteLink而不是ActionLink。你的代码看起来应该是这样的

@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 })