ФОРМАТ HTML.Метод ActionLink
Допустим у меня есть класс
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.
10 ответов:
Я думаю, что вы хотите это:
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 signature:
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 signature:
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). )
это позволяет избежать жесткого кодирования любой логики маршрутизации в ссылку.
<a href="/Item/Login/5">Title</a>
это даст вам следующий вывод 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 );
Я хотел добавить к ответ Джозефа Кингри. Он предоставил решение, но сначала я не мог заставить его работать и получил результат, как и Адхип Гупта. И тогда я понял, что маршрут должен существовать в первую очередь и параметры должны точно соответствовать маршруту. Поэтому у меня был идентификатор, а затем текстовый параметр для моего маршрута, который также необходимо было включить.
Html.ActionLink(article.Title, "Login", "Item", new { id = article.ArticleID, title = article.Title }, null)
вы можете посмотреть на
RouteLink()
метод.Это позволяет вам указать все (кроме текста ссылки и имени маршрута) через словарь.
Я думаю, что Джозеф перевернул контроллер и действие. Сначала идет действие, затем контроллер. Это несколько странно, но так выглядит подпись.
просто чтобы прояснить ситуацию, это версия, которая работает (адаптация примера Джозефа):
Html.ActionLink(article.Title, "Login", // <-- ActionMethod "Item", // <-- Controller Name new { id = article.ArticleID }, // <-- Route arguments. null // <-- htmlArguments .. which are none )
Как насчет этого
<%=Html.ActionLink("Get Involved", "Show", "Home", new { id = "GetInvolved" }, new { @class = "menuitem", id = "menu_getinvolved" } )%>
если вы хотите пойти все модные брюки, вот как вы можете расширить его, чтобы иметь возможность сделать это:
@(Html.ActionLink<ArticlesController>(x => x.Details(), article.Title, new { id = article.ArticleID }))
вам нужно будет положить это в
System.Web.Mvc
пространство имен: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; } }
это включает в себя два переопределения
Route Values
иHTML Attributes
, кроме того, все ваши взгляды должны были бы добавить:@using YourProject.Controllers
или вы можете добавить его в свойweb.config <pages><namespaces>
использовать именованные параметры для лучшей читаемости и избежать путаницы:
@Html.ActionLink( linkText: "Click Here", actionName: "Action", controllerName: "Home", routeValues: new { Identity = 2577 }, htmlAttributes: null)
С MVC5 я сделал это так и это 100% рабочий код....
@Html.ActionLink(department.Name, "Index", "Employee", new { departmentId = department.DepartmentID }, null)
вы, ребята, можете получить представление из этого...
этот тип использования:
@Html.ActionLink ("MainPage","Index","Home")
Главная страница: название текста Индекс: Вид Действия Дом : HomeController
Base Use ActionLink
<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>