当前位置:  开发笔记 > 编程语言 > 正文

HTML.ActionLink方法

如何解决《HTML.ActionLink方法》经验,为你挑选了8个好方法。

假设我有一堂课

public class ItemController:Controller
{
    public ActionResult Login(int id)
    {
        return View("Hi", id);
    }
}

在不在Item文件夹中的页面上ItemController,我想创建一个指向该Login方法的链接.那么Html.ActionLink我应该使用哪种方法以及我应该传递哪些参数?

具体来说,我正在寻找替代方法

Html.ActionLink(article.Title,
    new { controller = "Articles", action = "Details",
          id = article.ArticleID })

已经在最近的ASP.NET MVC化身中退役了.



1> Joseph Kingr..:

我想你想要的是这个:

ASP.NET MVC1

Html.ActionLink(article.Title, 
                "Login",  // <-- Controller Name.
                "Item",   // <-- ActionMethod
                new { id = article.ArticleID }, // <-- Route arguments.
                null  // <-- htmlArguments .. which are none. You need this value
                      //     otherwise you call the WRONG method ...
                      //     (refer to comments, below).
                )

这使用以下方法ActionLink签名:

public static string ActionLink(this HtmlHelper htmlHelper, 
                                string linkText,
                                string controllerName,
                                string actionName,
                                object values, 
                                object htmlAttributes)

ASP.NET MVC2

两个论点已被切换

Html.ActionLink(article.Title, 
                "Item",   // <-- ActionMethod
                "Login",  // <-- Controller Name.
                new { id = article.ArticleID }, // <-- Route arguments.
                null  // <-- htmlArguments .. which are none. You need this value
                      //     otherwise you call the WRONG method ...
                      //     (refer to comments, below).
                )

这使用以下方法ActionLink签名:

public static string ActionLink(this HtmlHelper htmlHelper, 
                                string linkText,
                                string actionName,
                                string controllerName,
                                object values, 
                                object htmlAttributes)

ASP.NET MVC3 +

参数与MVC2的顺序相同,但不再需要id值:

Html.ActionLink(article.Title, 
                "Item",   // <-- ActionMethod
                "Login",  // <-- Controller Name.
                new { article.ArticleID }, // <-- Route arguments.
                null  // <-- htmlArguments .. which are none. You need this value
                      //     otherwise you call the WRONG method ...
                      //     (refer to comments, below).
                )

这避免了将任何路由逻辑硬编码到链路中.

 Title 

这将为您提供以下html输出,假设:

    article.Title = "Title"

    article.ArticleID = 5

    您仍然定义了以下路线

..

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


@Chris S - 我知道这是一个老帖子,但是?Length = 8的原因是因为你需要在你的`new {...}`之后有一个`,null`参数...因为如果你检查该方法的重载,它认为你的参数是htmlArguments ...而不是路由参数.要使用*correct*方法,你需要使用具有`routeArguments,htmlArguments`的方法.所以只需为最后一个`htmlArgument`传入null.这个回复中的第一段代码有它.我已经更新了这篇文章,因此您可以轻松地看到它(即它不会滚动).
奇怪的是如果你错过了最后一个参数,它会附加给我?长度= 8到当前动作
在MVC3中找不到id属性......应该使用以下内容:`@ Html.ActionLink("Text","Action","Controller",new {item.ID},null)`
有没有人用MVC 3试过这个?似乎上面示例中的ControllerName和ActionMethod行被翻转.有人见过吗?
但是,这不会给出像/ Item/Login这样的URL吗?id = 5?
@JosephKingry对不起,我知道这个帖子很旧,但对于这个方法,MVC 1,2和3之间没有区别.[MVC 1没有`action`和`controller`切换](http ://msdn.microsoft.com/en-us/library/dd504972%28v=VS.90%29.aspx),[MVC 3仍需要正确命名的Route参数](http://msdn.microsoft.com/ EN-US /库/ dd504972%28V = VS.98%29.aspx).如果我弄错了,请指出一些文件.
我建议在这种情况下使用命名参数,因此每个人(程序员和编译器)都清楚什么是什么:`@ Html.ActionLink(article.Title,actionName:“ Item”,controllerName:“ Login”,routeValues:new { article.ArticleID},htmlAttributes:null)`

2> Jeff Widmer..:

我想补充约瑟夫金瑞的回答.他提供了解决方案,但起初我无法让它工作,并得到像Adhip Gupta一样的结果.然后我意识到路线必须首先存在,参数需要与路线完全匹配.所以我有一个id,然后是我的路线的文本参数,也需要包含它.

Html.ActionLink(article.Title, "Login", "Item", new { id = article.ArticleID, title = article.Title }, null)


这正是我需要的 - 我忘了添加最终的*null*参数.谢谢.

3> Haacked..:

您可能希望查看该RouteLink()方法.您可以通过字典指定所有内容(链接文本和路由名称除外).


很高兴看到一个如何解决这个问题的例子; MSDN页面有很多重载,知道要查找的内容可能会令人困惑

4> agez..:

我认为约瑟夫打开了控制器和动作.首先是动作然后是控制器.这有点奇怪,但签名的样子.

只是为了澄清事情,这是有效的版本(适应约瑟夫的例子):

Html.ActionLink(article.Title, 
    "Login",  // <-- ActionMethod
    "Item",   // <-- Controller Name
    new { id = article.ArticleID }, // <-- Route arguments.
    null  // <-- htmlArguments .. which are none
    )



5> 小智..:

那这个呢

<%=Html.ActionLink("Get Involved", 
                   "Show", 
                   "Home", 
                   new 
                       { 
                           id = "GetInvolved" 
                       }, 
                   new { 
                           @class = "menuitem", 
                           id = "menu_getinvolved" 
                       }
                   )%>



6> Adhip Gupta..:
Html.ActionLink(article.Title, "Login/" + article.ArticleID, 'Item") 



7> Serj Sagan..:

如果你想要所有的花式裤子,这里是你可以扩展它以便能够做到这一点:

@(Html.ActionLink(x => x.Details(), article.Title, new { id = article.ArticleID }))

您需要将其放在System.Web.Mvc命名空间中:

public static class MyProjectExtensions
{
    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, Expression> expression, string linkText)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName));
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, Expression> expression, string linkText, object routeValues)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues));
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, Expression> expression, string linkText, object routeValues, object htmlAttributes) where TController : Controller
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var attributes = AnonymousObjectToKeyValue(htmlAttributes);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues));
        link.MergeAttributes(attributes, true);
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    private static Dictionary AnonymousObjectToKeyValue(object anonymousObject)
    {
        var dictionary = new Dictionary();

        if (anonymousObject == null) return dictionary;

        foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(anonymousObject))
        {
            dictionary.Add(propertyDescriptor.Name, propertyDescriptor.GetValue(anonymousObject));
        }

        return dictionary;
    }
}

这包括两个覆盖,Route Values以及HTML Attributes您需要添加的所有视图:@using YourProject.Controllers或者您可以将其添加到您的视图中web.config


很好用的fancypants这个词.我们看不够.

8> guneysus..:

使用命名参数以获得最佳可读性并避免混淆:

@Html.ActionLink(
            linkText: "Click Here",
            actionName: "Action",
            controllerName: "Home",
            routeValues: new { Identity = 2577 },
            htmlAttributes: null)

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有