-1

我的目标是让我的 CompanyController 的所有方法共享相同的“id”参数,而不必通过 RouteValueDictionary 显式传递它,因为这很混乱且容易出错。

因此,例如,如果我在页面http://FooBar.com/Company/Index/4782上并且我想生成指向同一控制器的“配置文件”方法的链接,我会写 @Html.ActionLink("Go to profile”,“Profile”),它会产生http://FooBar.com/Company/Profile/4782并且每次我需要这样的链接时我都不必指定新的 {id=id} 。

有推荐的方法吗?

4

2 回答 2

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

于 2012-11-21T00:54:07.603 回答
0

里面的 Actionlink 实现System.Web.Mvc.Html.LinkExtensions (System.Web.Mvc, Version=4.0.0.0)如下...

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")它,它会在生成 Url 时自动将正确的 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)
于 2012-11-21T16:28:13.393 回答