Html.ActionLink Verfahren
-
03-07-2019 - |
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.
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:
-
article.Title = "Title"
-
article.ArticleID = 5
- 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>