【问题标题】:Problem Routing domains subfolder问题路由域子文件夹
【发布时间】:2011-02-01 14:28:49
【问题描述】:

我对 ASP.NET MVC 还很陌生,我希望这不是一个太愚蠢的问题。所以它来了。

我有...

我的问题...

  • 我的应用程序的路由(在域名后不使用子文件夹的情况下,它运行良好)。应用程序主页加载不错,有 css 文件,但没有像图像这样的资源(在 css 文件中定义),也没有类似于 /mycontroller/myaction 的 jQuery ajax 调用
  • 链接只能使用一次(我第二次得到类似此链接的页面:http://mydomain/mysubfoler1/myappfolder/myController/myController/myAction
  • jquery ajax 调用 不起作用。 (我在脚本文件夹中有额外的 js 文件,它们正在调用多个控制器操作。p.e.


$.getJSON("../mycontroller/myaction/" + id, function(figure) {
    // do something
    });



这是我的 Global.asax 包含路由:

public static void RegisterRoutes(RouteCollection routes)

{

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(    
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "myController", action = "Index", id = "" }
        defaults    
    );

    routes.MapRoute(    
        "Root",
        "",
        new { controller = "myController", action = "Index", id = "" }   
    );    
}

protected void Application_Start()    
{    
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyApplicationWeb.LocalizationWebFormViewEngine());
    RegisterRoutes(RouteTable.Routes);
    //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}

有什么建议吗?我的第一个建议是使用以下区域:

"mysubfolder1/myappfolder/{controller}/{action}/{id}"

(但没有任何运气)

非常感谢您的帮助!

【问题讨论】:

  • 您能详细说明您的问题吗?我对问题是什么感到有些困惑。是不是你的图片没有加载?

标签: jquery asp.net-mvc routing


【解决方案1】:

...css 文件,但没有类似的资源 图像(在 css 文件中定义)和 没有类似的 jQuery ajax 调用 /mycontroller/myaction

您需要编辑所有 jQuery/CSS 图像链接或 URL。 ASP.NET MVC 路由仅适用于传入的 Web 请求,并且由于您的 css 文件是静态的,因此使用 background-image: url('../images/background.png') 引用的任何图像都将与 css 文件所在的文件夹相关。

正如其他答案所述,在任何 View(.ascx 和 .aspx 文件)中,使用 <%= Url.Action("ActionName") %> 根据您的路由生成正确的 URL。同样,使用<%= Url.Content("~/folder/something.png") %> 为您的网络服务器上的任何内容(图像、css、js 等)生成链接。

但是,您不能在 .css 和 .js 文件中使用它们,因为它们不是使用 ASP.NET WebForms 视图引擎解析的。


根据评论更新:

由于 ASP.NET 不负责提供像 .css.js 这样的静态文件,因此您需要对文件中的操作/控制器的 URL 进行硬编码。

另一种但可能很混乱的方法是将字符串放置在您的 .css/.js 文件中,以便轻松区分(例如:{someAction})而不是实际 URL,然后创建任何 .css.js 文件链接指向controller 上的action。然后该操作将获取适当的文件,将其中的所有字符串替换为适当的 URL,然后将其输出回给用户。然后,您将使用以下内容来提供文件

return Content(fileText, "text/css"); // or "text/javascript"

另一种方法是将任何 css/js 放在单独的视图中(没有母版页),这样您就可以使用 Html 和 Url Helpers。然后,您可以通过使用适当的代码返回适当的视图来提供这些文件。注意:请确保您设置了正确的 ContentType,请参阅ASP.NET MVC and text/xml content type

【讨论】:

  • 谢谢!使用 Url-Helper 方法有很大帮助。但是如何处理 js 文件呢?示例:jquery 调用控制器操作:$.getJSON("/myController/myAction/1", { ajax: 'true' }, function(figure) { .... 有什么建议吗?
【解决方案2】:

我遇到了类似的问题,内容无法正确加载,使用 UrlHelper 类能够解决我的问题。该助手将为您的内容、链接等生成正确的 url。

<%=Url.Content("~/Content/Images/image.jpg")%>
<%=Url.Action("MyAction")%>

【讨论】:

    【解决方案3】:

    对应用程序的每个请求都将被拆分为斜杠字符之间的 URL 标记。路由“{controller}/{action}/{id}”将匹配域后 URL 的前三段。

    因此,添加子文件夹会破坏您的应用程序,因为子文件夹将被解释为控制器参数。当您说您使用“mysubfolder1/myappfolder/{controller}/{action}/{id}”没有任何运气时,您是什么意思?这将是一个适合您的简单方法。

    当您说您的链接不起作用时,我猜您可能没有正确生成它们。您应该使用Url.ActionUrl.Content 方法在您的应用程序内正确生成链接 - 这可以防止在您移动文件夹和路由表时它们中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多