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

时间:2016-03-01 00:17:47

标签: asp.net asp.net-mvc razor models viewbag

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

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

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

@model myProject.Models.Navigation

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

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

我仍然不确定这是否是正确的替代品,因为我无法包含&#34;导航&#34;没有收到错误。现在,在我曾经拥有的代码中:

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

我已将其替换为:

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

我收到了这个错误:

  

名称&#39;型号&#39;在当前上下文中不存在

显然,我是唯一一个从剃刀到aspx的人,因为它在网上确实存在。感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

WebForms通常不使用ViewBag,这只是一种在ASP.Net MVC中为您的View提供数据的方法。使用WebForms,一种将数据提供给“View”(包含HTML的aspx页面)的好方法是公开包含该数据的属性。

MVC方式可能是在您的Controller中设置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提供的代码应该可以正常工作。

答案 1 :(得分:1)

您的页面应该

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

在顶部指定模型类型。

答案 2 :(得分:0)

您可以使用 ViewState 代替 ViewBag,如​​下例所示。

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

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