我的目标是让我的CompanyController的所有方法共享相同的“id”参数,而不必通过RouteValueDictionary显式传递它,因为它很杂乱且容易出错。
因此,例如,如果我在页面http://FooBar.com/Company/Index/4782上并且我想生成指向同一控制器的“Profile”方法的链接,我会写@ Html.ActionLink(“转到配置文件”,“配置文件” “),它会生成http://FooBar.com/Company/Profile/4782,每次我需要这样的链接时,我都不必指定新的{id = id}。
有推荐的方法吗?
答案 0 :(得分:0)
更改默认路线中参数的顺序,如果可以使用,则会产生所需的结果。
所以,如果你拥有的唯一路线就是这个(注意没有默认值):
routes.MapRoute(
name: "NoDefault",
url: "{controller}/{action}/{id}/"
);
然后从您调用的页面http://foobar.com/Company/Index/4782
@Html.ActionLink("Manage Products", "ManageProducts", "Company", null, null)
你得到这个错误的链接(当前页面,似乎):http://foobar.com/Company/Index/4782/所以这不起作用。但是,如果您反转路线中的参数顺序,如下所示:
routes.MapRoute(
name: "NoDefault",
url: "{controller}/{id}/{action}"
);
并从同一页http://foobar.com/Company/4782/Index/开始,然后相同的ActionLink()调用正常,生成正确的链接:http://foobar.com/Company/4782/ManageProducts
答案 1 :(得分:0)
System.Web.Mvc.Html.LinkExtensions (System.Web.Mvc, Version=4.0.0.0)
内的Actionlink实现如下......
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
{
if (string.IsNullOrEmpty(linkText))
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "linkText");
else
return MvcHtmlString.Create(HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, linkText, (string) null, actionName, controllerName, routeValues, htmlAttributes));
}
有许多实用程序重载具有不同的参数组合。
因此,您应该可以添加扩展方法以轻松生成链接(未经测试)...
public static MvcHtmlString InternalActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
{
if (string.IsNullOrEmpty(linkText))
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "linkText");
else
RouteValueDictionary.Values.Add("id", htmlHelper.ViewContext.RequestContext.RouteData)
return MvcHtmlString.Create(HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, linkText, (string) null, actionName, controllerName, routeValues, htmlAttributes));
}
public static MvcHtmlString InternalActionLink(this HtmlHelper htmlHelper, string linkText, string actionName)
{
return this.InternalActionLink(htmlHelper, linkText, actionName, (string) null, new RouteValueDictionary(), (IDictionary<string, object>) new RouteValueDictionary());
}
显然,你需要添加一些简单的包装器重载来提供你想要的确切功能。
然后只使用html.InternalActionLink("Title", "Action")
,它会在生成网址时自动将正确的ID注入路线词典。
顺便提一下,框架提供了以下ActionLink()
重载 - 您实施的越多,您就越灵活......
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues)
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName)