将多个参数中的一个参数传递给控制器

本文关键字:一个 参数传递 控制器 参数 | 更新日期: 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方法,比如HtmlHelperActionLink,它将为您做到这一点,自动保持网站中的实际URL与您设置路由的方式一致。