我正在尝试对列表进行排序,同时保持当前正在查看的页码。我已经创建了一个pagehelper类和sorthelper类来执行此操作。问题是,控制器需要传递URL的整个末端,而不是只传递参数。如何路由它以便只传递正确的参数?
sorthelper.cs:
public static MvcHtmlString PageSort
(this HtmlHelper html, string LinkText, string sortOrder, string Category, PagingInfo pagingInfo, Func<int, string> pageUrl)
{
//Ref to Models.PagingInfo to get number of pages
StringBuilder result = new StringBuilder();
{
//Constructs the href per page
TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag
tag.MergeAttribute("href", "?sortOrder=" + sortOrder + pageUrl(pagingInfo.CurrentPage));
tag.InnerHtml = LinkText;
tag.AddCssClass("selected");
result.Append(tag.ToString());
}
//Dynamically creates links - String as href+pagenumber=URL
return MvcHtmlString.Create(result.ToString());
}
来自Entries.cshtml的链接:
@Html.PageSort("Case", "Case", Model._CurrentCategory, Model.PagingInfo, x=> Url.Action("Entries",
new { page = Model.PagingInfo.CurrentPage, category = Model._CurrentCategory}))
路线:
routes.MapRoute(null, "{category}/{sortOrder}/Page{page}", new
{
controller = "Entry",
action = "Entries"
},
new { sortOrder = @"\[A-Z]", page = @"\d+" }
);
当我排序时,我得到以下链接:
的http:// SNIP :?7511 /中将sortOrder =案例/页= 1
此实例中所需的参数只是“Case”,而是我得到“Case /?page = 1”。 我最初的想法是在控制器本身中使用正则表达式过滤网址但我感觉我过度复杂并且可能没有正确使用routeconfig。
这应该由路由,控制器还是帮助对象处理?怎么样?
谢谢!
修改 感谢您的信息。显然我过于复杂了。
<th>@Html.RouteLink("Case", "", new {category = Model._CurrentCategory, sortOrder = "Case", page = Model.PagingInfo.CurrentPage })</th>
这很有效,但显然我的数据库在所有条目中留下了尾随空格,所以这是一个我必须解决的单独问题。
答案 0 :(得分:1)
在表格{category}/{sortOrder}/Page{page}
的路线中,基本网址为http://SNIP:7511/
,类别&#34;默认&#34;,排序顺序&#34;案例&#34;,页& #34; 1&#34;将是:
http://SNIP:7511/default/Case/Page1
请注意,您不需要在URL本身中指定变量名称,这正是路由所做的 - 它指定了URL的各个部分应该如何映射到变量(以及指向变量)正确的控制者和行动)。
?sortOrder=
形式实际上是实现变量传递的另一种方式。在此表单中,您不会在路由中包含sortOrder
,但您可以将其作为Action方法的参数。这些只能出现在您网址的最后部分,因此,例如,如果您特别希望在此表单中使用sortOrder
,则必须将路由更改为:
{category}/Page{page}
您的网址将是:
http://SNIP:7511/default/Page1?sortOrder=Case
另请注意,您通常不应自行组装网址。有{@ 1}} HtmlHelper
这样的内置帮助方法会为您执行此操作,自动保持网站中的实际网址与您设置路线的方式一致