我可以在 .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;
}
}
我必须将 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;
}
}