将多个参数中的一个参数传递给控制器
本文关键字:一个 参数传递 控制器 参数 | 更新日期: 2023-09-27 18:00:47
我试图在保持当前查看的页码的同时对列表进行排序。为此,我创建了一个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"。我最初的想法是在控制器中使用Regex过滤url,但我觉得我过于复杂了,可能没有正确使用routeconfig。
这应该由路由、控制器或辅助对象来处理吗?怎样
谢谢!
编辑谢谢你提供的信息。显然我把它复杂化了。
<th>@Html.RouteLink("Case", "", new {category = Model._CurrentCategory, sortOrder = "Case", page = Model.PagingInfo.CurrentPage })</th>
这很有效,但显然我的数据库在所有条目中都留下了尾随空格,所以这是我必须解决的另一个问题。
在形式为{category}/{sortOrder}/Page{page}
、具有基本URL http://SNIP:7511/
的路由中,类别"default"、排序顺序"Case"、页面"1"的正确路由为:
http://SNIP:7511/default/Case/Page1
请注意,您不需要在URL本身中指定变量名,这正是路由的作用——它指定了URL的各个部分应如何映射到变量(以及指向正确的控制器和操作)。
?sortOrder=
形式实际上是实现变量传递的一种不同方式。在这个表单中,您不会在路由中包含sortOrder
,但您会将其作为Action方法的参数。这些只能出现在你的URL的最后一部分,所以例如,如果你特别想让sortOrder
处于这种形式,你就必须将你的路线更改为:
{category}/Page{page}
你的网址是:
http://SNIP:7511/default/Page1?sortOrder=Case
还要注意,您通常不应该自己组装URL。有一些内置的Helper方法,比如HtmlHelper
的ActionLink
,它将为您做到这一点,自动保持网站中的实际URL与您设置路由的方式一致。