我可以在 .aspx 页面中使用 ViewBag 吗?

Can I use ViewBag in an .aspx page?

我必须将 UI 页面从 .cshtml 文件移动到 .aspx 文件。现在我有几个编译错误。

首先是 'ViewBag' 在当前上下文中不存在。我不能在 .aspx 中使用它吗?如果不是,什么是好的替代品?

其次,.cshtml 页面有模型声明:

@model myProject.Models.Navigation

我对其进行了更改,以便它可以在 .aspx 页面中工作,如下所示:

<%@ Import Namespace="myProject.Models" %>

我仍然不确定这是一个正确的替代,因为我无法在不出错的情况下包含单词 "Navigation"。现在,在我曾经拥有的代码中:

@foreach (myProject.Models.Navigationitem item in Model.navigationItems){...

我已将其替换为:

<% foreach (myProject.Models.Navigationitem item in Model.navigationItems){...

我得到这个错误:

The name 'Model' does not exist in the current context

显然,我是唯一一个从 razor 转到 aspx 的人,因为网上关于它的资料实在是太少了。感谢任何帮助。

您的页面应该有

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of myProject.Models.Navigation)" %>

在顶部指定模型类型。

WebForms 通常不使用 ViewBag,这只是一种使数据对 ASP.Net MVC 中的视图可用的方法。使用 WebForms,使数据对 "View"(包含 HTML 的 aspx 页面)可用的一种好方法是公开包含该数据的 属性。

MVC 方式可能是在您的控制器中设置 ViewBag.MyValue = "Some Value";,并在您的视图中使用 <h1>@ViewBag.MyValue</h1> 引用它。要在 WebForms 中做同样的事情,您首先要在代码隐藏中定义一个 属性:

protected string MyValue { get; set; }

然后,在某处设置值,也许在您的 Page_Load:

protected void Page_Load (object sender, EventArgs e)
{
    this.MyValue = "Some Value";
}

并使用 WebForms 语法在页面上写入值:

<h1><%= MyValue %></h1>

对于你的具体情况,你似乎并没有真正使用 ViewBag。没关系,您也可以将对象作为属性提供:

protected MyProject.Models.Navigation Model { get; set; }

protected void Page_Load (object sender, EventArgs e)
{
    this.Model = SomeMethodThatReturnsModel();
}

定义了 属性 并设置了值后,上面为 ASPX 编写的代码应该可以正常工作。

您可以使用 ViewState 而不是 ViewBag,如​​下例所示。

private List<TrimPackage> Packages
{
    get
    {
        return (List<TrimPackage>)ViewState["Packages"];
    }

    set
    {
        ViewState["Packages"] = value;
    }
}