私はクラスがあるとしましょう
public class ItemController:Controller
{
public ActionResult Login(int id)
{
return View("Hi", id);
}
}
ItemController
が存在するItemフォルダにないページでは、Login
メソッドへのリンクを作成したいです。それで、私はどのHtml.ActionLink
メソッドを使うべきで、どんなパラメータを渡すべきですか?
具体的には、私はメソッドの置き換えを探しています
Html.ActionLink(article.Title,
new { controller = "Articles", action = "Details",
id = article.ArticleID })
それは最近のASP.NET MVCの形では廃止されました。
私はあなたが欲しいものはこれだと思います:
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)
2つの引数が入れ替わりました
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)
引数は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
);
私は Joseph Kingryの答え に追加したいと思いました。彼は解決策を提供しましたが、最初はそれをうまく機能させることができず、Adhip Guptaのような結果を得ました。それから私はルートがそもそも存在していなければならず、パラメータはルートと正確に一致する必要があることに気づきました。それで私は自分のルートのためのidそしてそれからtextパラメータも持っていましたが、それもまた含める必要がありました。
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(article.Title, "Login/" + article.ArticleID, 'Item")
すべての派手なパンツに行きたい場合は、これを拡張してこれを行うことができます:
@(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
の2つのオーバーライドが含まれます。また、すべてのビューで次を追加する必要があります:@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)
皆さん、これからアイデアを得ることができます...