ViewBag 未在混合 Webforms/MVC 项目中声明
ViewBag not declared in hybrid Webforms/MVC project
我有一个现有的 webforms 项目 (.net 4.5.1),我刚刚将 MVC 添加到其中(我刚刚使用个人身份验证创建了一个新的 MVC 项目并将所有位复制到 Webforms 项目)。
当我导航到 Sitename/Home/index 之类的内容时,它工作正常并呈现页面。但是,当我导航到 Sitename/Account/Login 时,出现以下运行时错误:
error BC30451: 'ViewBag' is not declared. It may be inaccessible due
to its protection level.
这似乎发生在模型视图上。
我找到了其他指示检查 MVC 版本的答案,并且我所有的 MVC DLL 都是最新的(版本 5.2.3.0),以及最新的 Razor 相关内容。我还确认 web.config 文件存在于 View 目录中。我还做了一些标准的偏执狂事情,比如完全清理和重新编译、重新启动 Visual Studio 等
我在同一个控制器上尝试了一个新的测试操作,唯一的区别是失败的控制器有一个模型。这是两个操作(MyTest 有效,Login 无效):
<AllowAnonymous>
Function MyTest() As ActionResult
ViewBag.ReturnUrl = "testReturnUrl"
Return View()
End Function
'
' GET: /Account/Login
<AllowAnonymous>
Public Function Login(returnUrl As String) As ActionResult
ViewBag.ReturnUrl = returnUrl
Return View()
End Function
这是 MyTest 视图:
@Code
ViewBag.Title = "MyTest"
End Code
<h2>MyTest</h2>
Hiya!!
这是登录视图(Visual Studio 模板附带的默认视图,所以我只包含了前几行):
@ModelType LoginViewModel
@Code
ViewBag.Title = "Log in"
End Code
<h2>@ViewBag.Title.</h2>
.
.
.
这是我的 Views/Web.config:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
<system.web>
<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
<!--
Enabling request validation in view pages would cause validation to occur
after the input has already been processed by the controller. By default
MVC performs request validation before a controller processes the input.
To change this behavior apply the ValidateInputAttribute to a
controller or action.
-->
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
对修复或解决方法有任何想法吗?我很确定这不是 ViewBag 特有的,它很可能只是失败的第一件事。
好像跟命名空间有关。由于 webforms 应用程序很烦人地用 VB 编写,我想知道 VB 中的命名空间约定(子文件夹不会自动获得新的命名空间)是否在这里引起了问题?
无论如何,我将项目名称作为命名空间添加到 Views/Web.config 文件中,如下所示,然后重新启动 Visual Studio(否则 intellisense 仍然没有看到它)现在它工作正常.
我可能也在 Properties->References 列表中添加了命名空间,不太确定。
现在是配置命名空间部分:
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="MyProjectName" />
</namespaces>
</pages>
我有一个现有的 webforms 项目 (.net 4.5.1),我刚刚将 MVC 添加到其中(我刚刚使用个人身份验证创建了一个新的 MVC 项目并将所有位复制到 Webforms 项目)。
当我导航到 Sitename/Home/index 之类的内容时,它工作正常并呈现页面。但是,当我导航到 Sitename/Account/Login 时,出现以下运行时错误:
error BC30451: 'ViewBag' is not declared. It may be inaccessible due to its protection level.
这似乎发生在模型视图上。
我找到了其他指示检查 MVC 版本的答案,并且我所有的 MVC DLL 都是最新的(版本 5.2.3.0),以及最新的 Razor 相关内容。我还确认 web.config 文件存在于 View 目录中。我还做了一些标准的偏执狂事情,比如完全清理和重新编译、重新启动 Visual Studio 等
我在同一个控制器上尝试了一个新的测试操作,唯一的区别是失败的控制器有一个模型。这是两个操作(MyTest 有效,Login 无效):
<AllowAnonymous>
Function MyTest() As ActionResult
ViewBag.ReturnUrl = "testReturnUrl"
Return View()
End Function
'
' GET: /Account/Login
<AllowAnonymous>
Public Function Login(returnUrl As String) As ActionResult
ViewBag.ReturnUrl = returnUrl
Return View()
End Function
这是 MyTest 视图:
@Code
ViewBag.Title = "MyTest"
End Code
<h2>MyTest</h2>
Hiya!!
这是登录视图(Visual Studio 模板附带的默认视图,所以我只包含了前几行):
@ModelType LoginViewModel
@Code
ViewBag.Title = "Log in"
End Code
<h2>@ViewBag.Title.</h2>
.
.
.
这是我的 Views/Web.config:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
<system.web>
<httpHandlers>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
<!--
Enabling request validation in view pages would cause validation to occur
after the input has already been processed by the controller. By default
MVC performs request validation before a controller processes the input.
To change this behavior apply the ValidateInputAttribute to a
controller or action.
-->
<pages
validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
</configuration>
对修复或解决方法有任何想法吗?我很确定这不是 ViewBag 特有的,它很可能只是失败的第一件事。
好像跟命名空间有关。由于 webforms 应用程序很烦人地用 VB 编写,我想知道 VB 中的命名空间约定(子文件夹不会自动获得新的命名空间)是否在这里引起了问题?
无论如何,我将项目名称作为命名空间添加到 Views/Web.config 文件中,如下所示,然后重新启动 Visual Studio(否则 intellisense 仍然没有看到它)现在它工作正常.
我可能也在 Properties->References 列表中添加了命名空间,不太确定。
现在是配置命名空间部分:
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="MyProjectName" />
</namespaces>
</pages>