asp.netMVC3.0 一个页面做了Layout布局页后,引用的JavaScript和CSS失效了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.netMVC3.0 一个页面做了Layout布局页后,引用的JavaScript和CSS失效了相关的知识,希望对你有一定的参考价值。

写好Main.cshtml页面,Product.cshtm 加入
@
Layout = "~/Views/WebMain/Main.cshtml";

先是提示:
尚未对布局页“~/Views/WebMain/Main.cshtml”调用“RenderBody”方法。
加了RenderBody()后结果引用的全部javascript和CSS都失效了

不要用<script lang="javascript" scr="...."></script>的形式来写,RAZOR应该写成@Scripts.Render("~/Scripts/jquery.js"),这样就能避免路径改变或引用母板页而导致的连接失效问题
css可以用原来的<link>方式,但一定要用“~/”来指定路径!例如:
<link href="~/Content/style.css" type="text/css" rel="stylesheet" />追问

我用的是mvc3.0 ,用了@Scripts.Render("~/Scripts/jquery.min.js") 后, 提示:编译器错误消息: CS0103: 当前上下文中不存在名称“Scripts” 大神救救,这问题困扰我一整天了。

参考技术A 你要看输出网页的源代码(不要告诉我你不会),检查里面的css和js的路径是不是正确。追问

我也觉得是引用路径问题,但是检查了整晚的CSS和JavaScript的路径,换了几种路径表示方式,都没用。

新的 Asp.Net MVC5 项目生成一个无限循环到登录页面

【中文标题】新的 Asp.Net MVC5 项目生成一个无限循环到登录页面【英文标题】:New Asp.Net MVC5 project produces an infinite loop to login page 【发布时间】:2013-11-05 06:06:49 【问题描述】:

我正在使用 Visual Studio 2013 创建一个全新的项目,我选择 Asp.Net MVC 和框架 4.5.1 项目已创建,然后,我只做 F5 启动默认网页。不幸的是,它会产生一个重定向到登录页面的重定向,该页面也重定向到登录页面。这是我在浏览器中的网址的简短版本:

http://localhost:5285/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl%253D%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FAccount%2525252525252FLogin%2525252525253FReturnUrl%2525252525253D%252525252525

我在事件查看器中没有任何错误。但在屏幕上我看到:

"HTTP Error 404.15 - Not Found 请求过滤模块是 配置为拒绝查询字符串过长的请求。”

网站以 IIS Express 中的默认设置运行。我该如何解决这个问题?我猜我的 Visual Studio 2013 有问题?

编辑

如果我创建一个全新的网站并将其托管在 IIS 中,它就可以工作。但如果我创建一个新网站(不做任何修改)并点击播放(默认启动 IIS Express),它不会。

编辑 2

我已删除 Documents\IISExpress\config\applicationhost.config 中的每个 网站。我已经重新编译了所有内容,它创建了这个条目:

    <siteDefaults>
        <logFile logFormat="W3C" directory="%IIS_USER_HOME%\Logs" />
        <traceFailedRequestsLogging directory="%IIS_USER_HOME%\TraceLogFiles" enabled="true" maxLogFileSizeKB="1024" />
    </siteDefaults>
    <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
    <virtualDirectoryDefaults allowSubDirConfig="true" />
</sites>

我仍然收到 IIS Express 的错误,而不是 IIS。

【问题讨论】:

【参考方案1】:

在 Visual Studio 中突出显示项目

打开右侧的“属性”面板(或按 F4)

将“Windows 身份验证”设置为“禁用”

将“匿名身份验证”设置为“启用”

【讨论】:

关键是设置“匿名身份验证”为“启用” 但是如果我真的想要启用 Windows 身份验证并禁用匿名身份验证怎么办。这是因为我想获取用户的 Intranet 应用程序的 Windows 登录信息。 嗨 Rob,这些不是 Visual Studio 项目的属性。它们是 IIS 管理器中的设置。设置它们为我解决了问题。 解决了我的问题!!谢谢!!【参考方案2】:

您在登录操作中缺少[AllowAnonymous] 属性。

[AllowAnonymous]
public ActionResult Login(string returnUrl)

    // code....

第二种可能性,仅适用于 IIS Express:如果您多次创建相同的默认 WebApplication1 项目,使用不同的身份验证设置,IIS Express 会在其配置文件中存储额外的身份验证设置.比如:

    <location path="WebApplication1">
        <system.webServer>
            <security>
                <authentication>
                    <windowsAuthentication enabled="true" />
                    <anonymousAuthentication enabled="false" />
                </authentication>
            </security>
        </system.webServer>
    </location>
</configuration>

配置在用户的文档文件夹Documents\IISExpress\config\,你应该寻找:

applicationhost.config

然后删除上面提到的xml节点&lt;location path="WebApplication1"&gt;


VS 2015+ 的更新

如果您使用的是 Visual Studio 2015 或更高版本,请检查以下路径以获取配置文件: $(solutionDir)\.vs\config\applicationhost.config

每个解决方案都有自己的配置文件。

【讨论】:

不。默认情况下它就在那里,我没有改变任何东西。 让我试试 给我几分钟 我已经更新了这个问题。删除 xml 节点并不能解决问题。 不是site 部分,它是文件底部的单独location 部分。并搜索您的应用名称。 @Nenad 我刚刚花了几个小时来解决这个问题。我有一种预感,你的答案就是我的解决方案,但是 Documents 文件夹中的 applicationhost.config 文件没有引用我的项目,所以我放弃了这种方法——事实证明,这个决定还为时过早。实际上,您的答案是正确的,但是,文件位置在较新版本的 Visual Studio (2015+) 中发生了变化。该文件现在位于解决方案的根目录中。我已更新您的答案以包含此新信息。谢谢。【参考方案3】:

此问题是由于 MVC 5 模板选择(默认)的身份验证模式,这会触发 ReturnUrl 样式的重定向,如果配置不正确,可能会导致无限循环。

要禁用 OWIN 启动发现,请将此密钥添加到您的 webconfig 文件中。

<add key="owin:AutomaticAppStartup" value="false"/>

【讨论】:

哇,这解决了我的问题。到底怎么会有人找到这个?谢谢朋友。 这也解决了我的问题!怎么可能...?有人愿意分享它是什么吗?编辑:好吧,它不再重定向到登录页面而是显示 401 错误? 如果我需要owin启动怎么办? (事实上​​我已经建立了一个startup.cs) 现在我可以登录了,但它在注销时给我带来了问题。这对我来说不是最佳答案。谢谢,无论如何。 这是在 appsettings 中吗?【参考方案4】:

我不得不删除 (Source Link):

<authorization>
  <deny users="?" />
</authorization>

【讨论】:

使用 nuget update-package 命令升级后,这是我的问题...奇怪的是更新将这些行添加到 web.config 这很有趣,因为对我来说是另一种方式。我必须添加它才能使其工作!【参考方案5】:

我知道我可能会迟到,这不是直接针对 OP 的问题。但是如果以后有人来这里,再检查一下AllowAnonymousAuthorize 属性是,你也必须检查所有子操作

例如,我的布局(登录页面也使用)调用面包屑和侧边栏的 2 个子操作,但它们没有 AllowAnonymous 属性(控制器有 Authorize 属性)。

希望对您有所帮助。

【讨论】:

我花了两个小时才找到你的答案,然后花了 2 分钟才找到隐藏在我们的布局中缺少 AllowAnonymous 属性的子操作。 @nemesv 很高兴我能帮上忙 :) 感谢您的赏金! 我需要为我的导航布局添加一个 ViewModel 和 Controller。在 NavBarController Index() 操作上没有 [AllowAnonymous] 会导致 Login() 操作无限循环。【参考方案6】:

在 IIS 中,选择您的网站并检查身份验证,如果您使用的是表单身份验证,那么 -

    将“Windows 身份验证”设置为“禁用”, 将“匿名身份验证”设置为“启用” 将“表单身份验证”设置为“启用”

【讨论】:

我们的团队对解决方案进行了一些更改后,我收到了这个错误。这个答案对我帮助很大。谢谢。【参考方案7】:

ASP.Net MVC 5 模板将 Microsoft.Owin 和相关库添加到项目中。由于 Owin 基础架构不需要 Forms Authentication,因此模板还在 web.config 中引入了以下键。

<system.webServer>
  <modules>
    <remove name="FormsAuthentication" />
  </modules>
</system.webServer>

此键的存在可能是不希望循环返回登录页面的原因。评论它可能有助于解决某些人的问题。

【讨论】:

【参考方案8】:

我遇到了同样的问题,因为我的 MVC 项目是为 .Net 4.5 配置的,但我在 IIS 中使用 .Net 4.0 作为我的应用程序池。将其切换到 .Net 4.5 应用程序池,问题得到解决。我希望这对其他人有帮助!

【讨论】:

【参考方案9】:

TL:DR? 不要从授权页面调用受保护的 Web API(任何需要授权的 Web API),例如 ~/Account/Login(它本身可以不要这样做。)。如果这样做,您将进入服务器端的无限重定向循环。

原因

我发现罪魁祸首是AccountController::Authorize,而AccountController 是用[Authorize] 装饰的。

根本原因是从 HomeViewModel()(home.viewmodel.js 的第 6 行)调用 Sammy(),它正在访问“受保护的 Web API”。这是为 /Account/Login 完成的,这导致 /Account/Login 重定向到自身。

确认

您可以通过以下几种方法确认这是您问题的原因:

    [AllowAnonymous]装饰AccountController::Authorize 注释掉在视图模型构建期间进行的 Sammy() 调用。

解决方案

解决方案是只为已经需要授权的视图发出应用程序包(a.k.a “~/bundles/app”)。据我所知,/Account/ 视图是经典的基于 MVC 的视图,不是应用程序数据模型/视图模型的一部分,但我错误地将包 Scripts.Render(@"~/bundles/app") 调用移动到 _Layout.cshtml 中(导致要进行受保护的 Web API 调用所有 MVC 视图,包括 /Account/。)

【讨论】:

【参考方案10】:

在我的情况下:在我的 _layout.cshtml 中,我使用 Html.Action 从授权控制器调用 Action:例如:Html.Action("Count", "Product") -> 循环错误

修复:通过该操作中的 [AllowAnonymous] 属性进行装饰(或从 _layout 中删除这些 Html 助手)

【讨论】:

【参考方案11】:

我刚刚连续几个小时处理了这个问题。

对我来说,它在 Startup.Auth.cs 文件中。

此代码在被注释掉时会停止重定向循环。

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        );

【讨论】:

在我的例子中,我只需要注释掉 "LoginPath = new PathString("/Account/Login")" 您的建议是删除整个登录重定向功能。这对我来说似乎不是一个有效的解决方案。【参考方案12】:

请注意,这可能是有害的建议,直接修改应用程序主机配置文件很少是一个好主意,通常有工具可以安全地为您执行此操作(例如,在 Visual Studio. ) 在继续之前,请务必创建此文件的备份副本,以防您的 IIS Express 被丢弃。

为了解决这个问题,我采用了位于此处的默认 IIS 配置文件:

C:\Windows\System32\inetsrv\config\applicationHost.config

到我的文档

%userprofile%\documents\iisexpress\config\applicationhost.config

它奏效了。

这是因为我设置了一些 Windows 身份验证,而不是匿名帐户。

【讨论】:

这对我不起作用,只是导致 iisexpress 在启动时崩溃【参考方案13】:

确保管道中没有具有授权属性的操作。 就我而言,我的布局有导航菜单控制器,但缺少 allowAnonymous 属性。

【讨论】:

【参考方案14】:

感谢这个公认的答案,我解决了同样的问题:ASP.NET Login Redirect Loop when user not in role。

可能包含登录操作的控制器用AuthorizeAttribute(甚至是自定义的)修饰,而登录操作没有用AllowAnonymous 属性修饰。从控制器中删除AuthorizeAttribute 并将AllowAnonymous 添加到登录操作可能是一种可能的解决方案。

【讨论】:

它可能会打开以前受保护的其他操作。【参考方案15】:

这些答案或多或少是同一个谜题的一部分;我会尽量把所有东西都放在一个地方。 OP 描述的问题在我实现 OWIN 管道和 AspNET Identity 的那一刻打击了我的应用程序。

那么让我们看看如何解决它...

    OWIN 启动

我猜你需要它,因为如果你不需要,那么你就不需要身份验证,我猜你需要。 除了你正在使用一些老式的身份验证,我猜你没有。 所以,不要删除任何一个 OWIN 启动属性...

[assembly: OwinStartupAttribute(typeof(YourApp.Probably_App_Start.SomethingLikeAuthConfig))]

...或者配置行...

<add key="owin:AppStartup" value="YourApp.Probably_App_Start.SomethingLikeAuthConfig" />
    对控制器的访问限制

现在我们解决了这个问题,您需要进行身份验证。这意味着您的每个控制器都需要[Authorize] 属性,或者您可以通过全局注册事物来对一个地方的所有控制器执行相同的操作(例如,在RegisterGlobalFilters() 中,添加行filter.Add(new AuthorizeAttribute()))。 在前一种情况下(分别保护每个控制器时)跳过这一部分,直接进入下一个。 在后一种情况下,您的所有控制器都将受到保护,以防止未经授权的访问,因此您需要该授权的入口点 - 未受保护的 Login() 操作。 只需添加...

[AllowAnonymous]

...你应该很好。

    OWIN cookie 配置

当您的用户登录时,他的浏览器会存储加密的(希望如此!)cookie,以简化系统操作。因此,您需要 cookie - 不要删除显示 UseCookieAuthentication 的行。

    您真正需要做的是关闭 Web 应用程序的 IIS 集成身份验证机制。这意味着通过设置Anonymous Authentication(启用)关闭Windows Authentication(禁用)并允许任何用户进入,至少只要现在涉及IIS Express。

当您启动您的网站时,这会将这些设置复制到 IIS Express 配置 (applicationhost.config) 中,您应该会看到以下两行:

<windowsAuthentication enabled="false" />
<anonymousAuthentication enabled="true" />

    您的 web.config 中可能有授权配置,上面写着deny users="?"。这意味着授权子系统被指示阻止匿名用户进入。 使用 OWIN,这仍然可以按设计工作。您要么必须删除它,要么让您的匿名用户能够使用类似...的方式访问登录页面。

    <location path="Account/Login"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>

HTH

【讨论】:

【参考方案16】:

我在本地回调网站时遇到了类似的问题,它处于无限循环中。事实证明,在本地调试时,它正在重定向端口。我在项目属性屏幕中更新了端口号,但在云项目中保留了相同的 Azure 定义,一切都开始按预期工作。

【讨论】:

【参考方案17】:

我的 Asp.Net MVC 4 项目遇到了同样的问题。我通过转到 Startup.cs 并注释掉 ConfigureAuth(app) 的行来解决它

    public void Configuration(IAppBuilder app)
    
        //ConfigureAuth(app);
    

我还确保我在 IIS 中为我​​的项目启用了 Windows 身份验证,并禁用了所有其他身份验证选项。

【讨论】:

【参考方案18】:

对我来说,这是因为我的 LoginViewModel 包含对翻译资源文件的引用,显然受到身份验证的保护。我删除了那些引用,问题就解决了。

【讨论】:

【参考方案19】:

对我来说,删除以下块修复了它:

<authorization>
  <deny users="?" />
  <allow users="*" />
</authorization>

假设

<authentication mode="None" />

【讨论】:

【参考方案20】:

在我的情况下,这是一个非常复杂的问题,我用不存在的角色装饰了家庭控制器。所以它会导致重定向循环。

【讨论】:

【参考方案21】:

转到您的 applicationhost.config 文件并设置 anonymousauthentication = "true"

<authentication>

            <anonymousAuthentication enabled="true" userName="" />
            <windowsAuthentication enabled="true">
                <providers>
                    <add value="Negotiate" />
                    <add value="NTLM" />
                </providers>
            </windowsAuthentication>

        </authentication>

【讨论】:

以上是关于asp.netMVC3.0 一个页面做了Layout布局页后,引用的JavaScript和CSS失效了的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript/jQuery 重定向到 ASP.NET MVC 中的另一个页面

将 CurrentUICulture 传递给 ASP.NET MVC 3.0 中的异步任务

将 Knockout.js 与最新的 jQuery 文件和 ASP.NET MVC 一起使用

Asp.Net MVC EF各版本区别

Asp.Net NVC EF 个版本的区别

Asp.Net MVC3.0网站统计登录认证的在线人数