我正在尝试在ASP.NET MVC中实现分页和排序列表,而不使用MVContrib网格或javascript(需要对seo友好)。
我使用以下签名构建了我的动作:
ActionResult List(int? page, string sort, string direction);
我遇到的问题是让分页和排序都能正常工作。比方说,我有以下代码:
<%= Html.ActionLink("Title", "List", new { sort = "Title", direction = "ASC" }) %>
我希望这会生成一个包含所有现有路由值(包括当前页面)的URL,但它不会。因此,当您单击链接时,页面将设置为null。
我已经查看了ActionLink帮助程序的所有重载,但看起来没有任何帮助。我实际需要做的是生成一个包含现有页面值(或可能是任何其他路由值)的url / link和新的排序参数。
如果有人可以提供帮助,我会很感激。感谢。
答案 0 :(得分:0)
您需要编写自己的html帮助程序,这很容易。为此,请使用以下格式:
public static class MyExtensions
{
public static string MyActionLink(this HtmlHelper html, ...)
{
//Definition, return string
}
}
并使用它来创建自己的。您可以访问HTML帮助程序中的信息以获取有关当前请求的信息(提取当前路径值并将它们与现有路径值组合...
HTH。
答案 1 :(得分:0)
为什么不能在路线值中指定页面,如下所示?
<%= Html.ActionLink("Title", "List", new { page = currentPage, sort = "Title", direction = "ASC" }) %>
我会猜测ActionResult List(int? page, string sort, string direction);
的模型是您当前的项目列表,因此您还没有获得currentPage。如果是这种情况,请创建一个包含列表和currentPage的视图模型。 e.g。
// View Model
public class MyViewModel
{
public int CurrentPage { get; set; }
public IList<SomeObject> Items { get; set; }
}
// Action Method
public ActionResult List(int? page, string sort, string direction)
{
return View(new MyViewModel()
{
CurrentPage = page ?? 1,
Items = _myRepository.GetPagedList(page, sort, direction);
});
}
// View
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.Controllers.MyController.MyViewModel>" %>
...
<%= Html.ActionLink("Next", "List", new { page = Model.CurrentPage + 1, sort = "Title", direction = "ASC" }) %>
<% foreach (SomeObject obj in Model.Items) { %>
<!-- Display each item -->
<% } %>
答案 2 :(得分:0)
问题解决了。我设法提出了以下扩展方法:
public static class ActionLinkExtensions
{
public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, bool addExistingRouteValues)
{
return ActionLink(helper, linkText, actionName, null, null, addExistingRouteValues, null);
}
public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, object routeValues, bool addExistingRouteValues)
{
return ActionLink(helper, linkText, actionName, null, routeValues, addExistingRouteValues, null);
}
public static MvcHtmlString ActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, object routeValues, bool addExistingRouteValues, object htmlAttributes)
{
var queryString = helper.ViewContext.HttpContext.Request.QueryString;
var newRouteValues = routeValues == null ? helper.ViewContext.RouteData.Values : new RouteValueDictionary(routeValues);
if (addExistingRouteValues)
{
foreach (string key in queryString.Keys)
{
if (!newRouteValues.ContainsKey(key))
newRouteValues.Add(key, queryString[key]);
}
}
return MvcHtmlString.Create(HtmlHelper.GenerateLink(helper.ViewContext.RequestContext, helper.RouteCollection, linkText, null, actionName, controllerName, newRouteValues, new RouteValueDictionary(htmlAttributes)));
}
}
现在,您所要做的就是在助手的末尾添加true,并添加现有的路由值。希望这会有所帮助。