【问题标题】:ASP MVC Routing of root directory根目录的 ASP MVC 路由
【发布时间】:2015-10-12 09:08:50
【问题描述】:

我们在需要相互通信的同一台服务器上部署了多个 Web 应用程序。例如,IIS 的 wwwroot 文件夹中部署了 2 个应用程序:Foo 和 Bar。

问题是:从 Foo web 应用程序中的 FooView.cshtml 视图,我需要从 BarTest 控制器的 MyAction /strong> 网络应用程序。

现在我们必须像这样对 url 进行硬编码:

<a href="\Bar\Test\MyAction?id=100">Test action</a>

如何在路由配置中定义它,以便我们可以使用 Url.Action 或 Url.Route 之类的方法来调用动作?提前致谢。

【问题讨论】:

  • 然后你不能合并这个应用程序并使用areas
  • 我不确定在另一个应用程序中使用 @Url.Action 是否有意义。它不是在您正在编码的应用程序中使用标准路由,而是就应用程序而言,它是指向其他地方的链接。如果您经常这样做,您可以轻松创建自己的 HTML 帮助程序来链接到它。
  • @teovankot:我知道,但它们是独立的应用程序,所以我们不能合并为一个。 :)
  • @PhucVD 好吧,那我想没有办法,因为你不能轻松地从不同的应用程序中使用RouteConfig。 Offcorse 您可以使用 Common RouteConfig 创建库并创建自己的 HtmlHelper 就像 @Coulton 建议一样,但我看不出这种方法有很多优点。
  • @Coulton:我同意,Url.Action 可能不支持这个,但我认为我们可以使用其他方法加上一些配置。

标签: asp.net-mvc routing


【解决方案1】:

如果使用@Url.Action@Html.RouteLink 为应用程序外部存在的操作创建链接是没有意义的。

帮助程序利用应用程序中存在的路由信息​​并相应地生成相关链接。路由配置明确限制在路由中定义外部 URL。

如果您经常这样做,您可以轻松创建自己的 HTML 帮助程序来链接到它:

namespace System.Web.Mvc.Html
{
    public const string ExternalAppName = "externalapp";

    public static class ExternalHelpers
    {
        public static MvcHtmlString ExternalLink(this HtmlHelper htmlHelper, string externalPath, string linkText)
        {
            var tb = new TagBuilder("a");
            tb.MergeAttribute("href", Path.Combine("/" + ExternalAppName + externalPath));
            tb.SetInnerText(linkText);

            return new MvcHtmlString(tb.ToString());
        }
    }

    // Accepts a controller and action
    public static MvcHtmlString ExternalLink(this HtmlHelper htmlHelper, string controller, string action, int id, string linkText)
    {
        var tb = new TagBuilder("a");
        tb.MergeAttribute("href", Path.Combine("/" + ExternalAppName + "/", controller + "/" + id.ToString()));
        tb.SetInnerText(linkText);

        return new MvcHtmlString(tb.ToString());
    }
}

查看:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@Html.ExternalLink("/home/index", "Click to go to external app!")

【讨论】:

  • 谢谢你:)。这是一个很好的解决方案,我们可以为外部应用程序名称添加一个参数,使其更灵活。但是我发现我们仍然需要为控制器、动作和路由参数(如果有的话)传递一个手动构造的 url。
  • 您可以在此方法上创建一个变体,如果您愿意,可以接受控制器和操作。我在答案中添加了一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多