ViewBag 未在混合 Webforms/MVC 项目中声明

Posted

技术标签:

【中文标题】ViewBag 未在混合 Webforms/MVC 项目中声明【英文标题】:ViewBag not declared in hybrid Webforms/MVC project 【发布时间】:2015-05-15 16:18:46 【问题描述】:

我有一个现有的 webforms 项目 (.net 4.5.1),我刚刚将 MVC 添加到(我刚刚使用个人身份验证创建了一个新的 MVC 项目并将所有位复制到 Webforms 项目)。

当我导航到站点名称/主页/索引之类的内容时,它可以正常工作并呈现页面。但是,当我导航到 Sitename/Account/Login 时,我收到以下运行时错误:

错误 BC30451:未声明“ViewBag”。由于可能无法访问 到它的保护级别。

这似乎发生在带有模型的视图上。

我发现其他答案表明检查 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 特有的,它可能只是失败的第一件事。

【问题讨论】:

【参考方案1】:

它似乎与命名空间有关。由于 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>

【讨论】:

以上是关于ViewBag 未在混合 Webforms/MVC 项目中声明的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Razor 视图引擎在 JavaScript 中正确混合 C# 代码。我希望根据 ViewBag 中的值包含或省略 Javascript

混合应用推送通知图标未在 Android 8 (Oreo) 上显示

IBM MobileFirst Platform 未在 iOS 上为混合应用程序触发远程禁用消息

Android WebView 混合内容未在 api 级别 < 21 中加载

自动热键变量未在按键时更新

如何从 JS 访问 ViewBag