【问题标题】:MVC routing and deploymentMVC 路由和部署
【发布时间】:2016-08-27 17:03:11
【问题描述】:

我已经为此苦苦挣扎了很多天。我是 MVC 的新手,我被这些问题困住了。我有一个 mvc 应用程序。以下是我从上一篇文章中了解到的 route.config 文件不正确。我的页面相当简单,没有查询字符串,除了一页。每个页面都是控制器/视图格式。这种配置的正确路由配置是什么。如果有人可以通过一些解释帮助我,那就太好了。当我在 IIS 中部署该应用程序时,我遇到了此路由的问题。 当我在 IIS 中部署并进行浏览时,它直接进入我的登录页面,这很好,但在内部它会进入

    http://localhost/Home/accountdetails 

而不是去

    http://localhost/MyWebsite/Home/accountdetails 

因此我收到 404 错误。我不明白如何设置它。此外,我在内容文件夹中的图片也没有显示出来,因为他们指的是

http://localhost/Content/Images/myimage 

当他们实际上在下时

http://localhost/MySite/Content/Images/myimage 

我该如何纠正这些问题。请在此处提供一些帮助。

这是我的 route.config

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
                name: "Home",
                url: "{controller}/{action}/{id}",
                defaults: new
                {
                    controller = "Home",
                    action = "Login",
                    id =
                        UrlParameter.Optional
                }
            );

        routes.MapRoute(
        name: "Invoice",
        url: "{controller}/{action}/{q}",
        defaults: new
        {
            controller = "Home",
            action = "GetInvoice",
            id =
                UrlParameter.Optional
        }
       );

        routes.MapRoute(
           name: "Error",
           url: "{controller}/{action}/{id}",
           defaults: new
           {
               controller = "Home",
               action = "Error",
               id =
                   UrlParameter.Optional
           }
       );
        routes.MapRoute(
           name: "ResetPassword",
           url: "{controller}/{action}/{id}",
           defaults: new
           {
               controller = "Home",
               action = "ResetPassword",
               id
                   = UrlParameter.Optional
           }
       );
        routes.MapRoute(
          name: "Accounts",
          url: "{controller}/{action}/{id}",
          defaults: new
          {
              controller = "Home",
              action = "AccountStatus",
              id
                  = UrlParameter.Optional
          }
      );

        routes.MapRoute(
           name: "Register",
           url: "{controller}/{action}/{id}",
           defaults: new
           {
               controller = "Home",
               action = "Register",
               id =
                   UrlParameter.Optional
           }
       );


        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new
            {
                controller = "Home",
                action = "Login",
                id =
                    UrlParameter.Optional
            }
        );
    }
}

更新

对于图片,我将背景图片设置如下

<div class="bannerOuter" style="background-image: url('../../Content/Images/AccountStatus_cropped-23.jpg');">

但在发布后,当我运行应用程序并按 f12 时,我看到它引用了以下图片的 url 并引发 404 错误。

http://localhost/Content/Images/Accounts_cropped-23.jpg 

但如果我更改 url 以添加我在 IIS 中指定的网站名称,我可以浏览到它。

http://localhost/MyWebsite/Content/Images/Accounts_cropped-23.jpg

所以这就是在这种情况下我的图像路径应该是什么的问题。

编辑

  @Html.EncodedActionLink(string.Format("{0} Statement", @Convert.ToDateTime(@invoiceItem.InvoiceDate).ToString("MMMM")), "GetInvoice", "Home", new { accountNumber = Model.CustomerModel.AccountNumber, dueDate = (Convert.ToDateTime(invoiceItem.DueDate).ToString("dd-MMM-yyyy")) }, new { target = "_blank", @class = "Link" })

所以这里的网址是

 http://localhost/Home/GetInvoice?q=ZDmgxmJVjTEfvmkpyl8GGWP4XHfvR%2fyCFJlJM1s0vKj4J6lYJWyEA4QHBMb7kUJq

怎么改成

 http://localhost/MySite/Home/GetInvoice?q=ZDmgxmJVjTEfvmkpyl8GGWP4XHfvR%2fyCFJlJM1s0vKj4J6lYJWyEA4QHBMb7kUJq

【问题讨论】:

  • 你所有的路由都有完全相同的 url 模式; “家”路线总是首先匹配,其余的将被完全忽略。根据您的描述,您不需要任何超出“主页”路线的东西。至于超链接和图片,我们需要看看您在视图中是如何引用它们的。
  • 谢谢..我按照你的建议做了,看起来没问题..但是图片..请看我的编辑

标签: asp.net-mvc routing


【解决方案1】:

内联 CSS 中的相对路径存在问题,因为它将相对于当前 URL。所以如果你去http://localhost/MySite/Home/Login,你需要使用../../Content/myimage.png。但是,如果您转到http://localhost/MySite,则 route.config 中的默认控制器和操作 (Home/Login) 将启动,现在图像的相对路径为 Content/myimage.png,因为控制器和操作未明确在网址。去http://localhost/MySite/Home也会出现同样的问题;将使用默认操作(Login),相对路径为../Content/myimage.png

最好的解决方案是在 CSS 文件中使用样式而不是使用内联样式;这样,图像 URL 总是相对于 CSS 文件,其 URL 永远不会改变。请注意,如果您在 BundleConfig.cs 中使用捆绑,则需要确保路径保持一致 MVC Bundling and CSS relative URLs

但如果您需要使用内联样式,您可以使用@Url.Content() 始终获得正确的路径,~ 是您应用的根:

style="background-image: url('@Url.Content("~/Content/myimage.png")'"

【讨论】:

  • 太棒了..非常感谢你的工作。只是另一个问题,我如何使用锚标签来做到这一点?我正在生成一个 pdf 文件,该文件采用我编码的查询字符串参数。所以我在上面的编辑中编写了一个 htmlhelper 扩展方法。即使这样我也有同样的问题,它需要相对 url,我不知道如何提及实际的 url。希望你能帮忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
相关资源
最近更新 更多