Frage

Lassen Sie uns sagen, ich habe eine Klasse

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

Auf einer Seite, die nicht an den Item-Ordnern befindet, wo ItemController wohnt, möchte ich einen Link zu der Login Methode erstellen. Also die Html.ActionLink Methode soll ich verwenden und welche Parameter sollte ich passieren?

Insbesondere, ich suche für den Ersatz des Verfahrens

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

, die in der jüngsten ASP.NET MVC Inkarnation im Ruhestand ist.

War es hilfreich?

Lösung

Ich denke, was Sie wollen, ist dies:

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).
                )

Dieses verwendet die folgende Methode Action Signatur:

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

ASP.NET MVC2

zwei Argumente wurden vertauscht

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).
                )

Dieses verwendet die folgende Methode Action Signatur:

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

ASP.NET MVC3 +

Argumente sind in der gleichen Reihenfolge wie MVC2 jedoch der ID-Wert ist nicht mehr erforderlich:

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).
                )

Dies vermeidet Hartcodierung jede Routing-Logik in die Verbindung.

 <a href="/Item/Login/5">Title</a> 

Dies wird Ihnen die folgende HTML-Ausgabe unter der Annahme:

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. Sie haben immer noch die folgende Route definiert

. .

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

Andere Tipps

Ich wollte Joseph Kingry Antwort hinzuzufügen. Er lieferte die Lösung aber zunächst konnte ich es auch nicht zu arbeiten und bekam ein Ergebnis wie Adhip Gupta. Und dann erkannte ich, dass die Route in erster Linie vorhanden sein muss und die Parameter müssen genau die Strecke entsprechen. So hatte ich eine ID und dann ein Textparameter für meine Route, die auch zu enthalten benötigt werden.

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

Sie können auf der RouteLink() method.That man lässt Sie alles (außer den Linktext und Routennamen) über ein Wörterbuch angeben.

Ich denke, dass Joseph Controller und die Aktion gekippt. Zuerst kommt die Aktion dann die Steuerung. Dies ist etwas seltsam, aber die Art und Weise der Unterschrift aussieht.

Nur um zu klären Dinge, das ist die Version, die (Adaption von Joseph Beispiel) arbeitet:

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

was ist das

<%=Html.ActionLink("Get Involved", 
                   "Show", 
                   "Home", 
                   new 
                       { 
                           id = "GetInvolved" 
                       }, 
                   new { 
                           @class = "menuitem", 
                           id = "menu_getinvolved" 
                       }
                   )%>
Html.ActionLink(article.Title, "Login/" + article.ArticleID, 'Item") 

Wenn Sie alle fancy-Hose gehen wollen, hier ist, wie Sie es verlängern kann in der Lage sein, dies zu tun:

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

Sie müssen dies im System.Web.Mvc Namespace setzen:

public static class MyProjectExtensions
{
    public static MvcHtmlString ActionLink<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> 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<TController, TAction>(this HtmlHelper htmlHelper, Expression<Action<TController, TAction>> 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<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> 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<string, object> AnonymousObjectToKeyValue(object anonymousObject)
    {
        var dictionary = new Dictionary<string, object>();

        if (anonymousObject == null) return dictionary;

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

        return dictionary;
    }
}

Dazu gehören zwei Überschreibungen für Route Values und HTML Attributes, auch, alle Ihre Ansichten hinzufügen müssten: @using YourProject.Controllers oder Sie können es auf Ihre web.config <pages><namespaces> hinzufügen

Verwenden Sie Parameter zur besseren Lesbarkeit genannt und Verwirrungen zu vermeiden.

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

Mit MVC5 ich habe es so gemacht und es ist 100% Arbeits Code ....

@Html.ActionLink(department.Name, "Index", "Employee", new { 
                            departmentId = department.DepartmentID }, null)

Ihre Jungs können eine Vorstellung davon bekommen ...

Diese Art Verwendung:

@ Html.ActionLink ( "Mainpage", "Index", "Home")

Mainpage: Name des Textes Index: Action View Home: Homecontroller

Basis verwendet Action

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>_Layout</title>
    <link href="@Url.Content("~/Content/bootsrap.min.css")" rel="stylesheet" type="text/css" />
</head>
<body>
    <div class="container">
        <div class="col-md-12">
            <button class="btn btn-default" type="submit">@Html.ActionLink("AnaSayfa","Index","Home")</button>
            <button class="btn btn-default" type="submit">@Html.ActionLink("Hakkımızda", "Hakkimizda", "Home")</button>
            <button class="btn btn-default" type="submit">@Html.ActionLink("Iletişim", "Iletisim", "Home")</button>
        </div> 
        @RenderBody()
        <div class="col-md-12" style="height:200px;background-image:url(/img/footer.jpg)">

        </div>
    </div>
</body>
</html>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top