繁体   English   中英

MVC中的ActionLink问题

[英]Issue with ActionLink in MVC

我该怎么写

Response.Write("<a href='/someurl'>Some Text</a>");

代替

Response.Write(Html.ActionLink(...));

我这样做的原因是因为我正在编写分页ViewUserControl。 在控件中,我希望它显示页码,下一页和上一页等。

当我使用以下代码

Response.Write(Html.ActionLink(page.ToString(), HttpContext.Current.Request.RawUrl, new { page = page }));

链接写为http://localhost:61293/customers/customers/System.Web.Mvc.UrlParameter/page2 ,这显然是错误的。

在此示例中, HttpContext.Current.Request.RawUrl == "/customers/" 我本来希望结果Url是/customers/page2 ,而不是实际写出的内容。

我的路线设置如下:

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}/page{page}", // URL with parameters
            new
            {
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional,
                page = UrlParameter.Optional
            } // Parameter defaults
        );

谁能阐明一些想法?

基于您的更新,您不应该将HttpContext.Current.Request.RawUrl用作ActionLink的操作。

http://msdn.microsoft.com/zh-CN/library/dd505040(v=VS.90).aspx

public static string ActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string actionName,
    object routeValues
)

如您所见, HttpContext.Current.Request.RawUrl与您的任何操作都不匹配。 尝试写作:

Html.ActionLink(page.ToString(), 
    "TheNameOfTheActionMethod", 
    new { page = page });

我认为您的路由设置不正确-可能是其中一条路由的错误位置中的参数。 我之所以这样说,是因为似乎正在调用UrlParameter类本身的ToString方法,从而导致输出该类的名称。

分页路由(来自注释)-假设“列表”操作为“索引”,并且您不希望索引操作出现在路由中。 请注意,它从当前请求继承了控制器,并且由于操作是按照惯例进行的,因此您无需提供它。 完全未经测试。

routes.MapRoute(
        "Pager", // Route name
        "{controller}/page{page}", // URL with parameters
        new
        {
            controller = "Home",
            action = "Index",
            page = UrlParameter.Optional
        } // Parameter defaults
    );

用作:

 <%= Html.RouteLink( page, "Pager", new { page = page }, null ) %> 
Url.Action("ActionMethodName", new { page = i });

克里斯,

通过阅读上面的“说明”和评论,我认为您只是使周围的事情变得过于复杂。

在行与行之间可以识别的最清楚的事情是,您需要某种可重用的小部件,以显示您的客户分页列表。

那么,为什么不简单地:

  • 创建CustomerController和一个Index()作为显示客户列表的操作
  • 映射将"customers""customers/page{page}"路由到CustomerController.Index()
  • 在需要呈现客户列表的任何地方使用Html.RenderAction("Index", "Customer", new {page = page})

按照这种方式,基础架构将为您完成所有繁重的工作(包括URL解析),您将获得“可重用的小部件”或“控件”。

至于提到的HttpContext.Current.Request.RawUrl东西-您必须决定:您是要使用ASP.NET 路由还是自己构建所有路由。 因为这些技术在某种程度上相互排斥。

PS无论如何,关于您要实现的目标的更多详细信息将帮助我们为您提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM