【问题标题】:Strongly typed Viewbag items强类型 Viewbag 项目
【发布时间】:2012-06-18 20:16:33
【问题描述】:

如果我使用包含强类型对象的 ViewBag,是否有任何方法在 MVC Razor 上定义(或强制转换)以便其所有元素出现在 IntelliSense 中?

比如说我有

ViewBag.Movies.Name
ViewBag.Movies.Length

我知道 Movies 是对象类型 Movie,它有成员 Name 和 length

class Movie { 
    public string Name {get; set;}
    public string Length {get; set;}
}

我可以像我为模型做的那样以某种方式投射这个

@model Transactions.UserTransactionDetails

Movie 的成员可以在 Razor 中使用吗?

【问题讨论】:

  • ViewBag 根本不是强类型的,因此您应该为此使用强类型模型。

标签: c# asp.net-mvc-3 razor viewbag


【解决方案1】:

你可以将它存储在一个变量中。

var movie = (Movie)ViewBag.Movie;

然后输入@movie. 将为NameLength 生成智能感知。

【讨论】:

    【解决方案2】:

    使用 ViewModel,其中包含您查看所需的所有不同对象的属性

    例如

    public class MovieTransactionViewModel 
    {
       public List<Transaction> Transactions { get; set; }
       public List<Movie> Movies { get; set; }
    }
    

    然后,让您的视图将其用作模型,您将在视图中获得智能感知。

    这样您就不会更改模型,因此 EntityFramework 不会受到影响。

    【讨论】:

      【解决方案3】:

      远离 ViewWbag: http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

      只需创建一个包含其他模型的新 ViewWModel。

      【讨论】:

      • 有时它很有用。例如,当您想在 _Layout.cshtml 的&lt;head&gt; 部分中设置 title 和 meda-description 属性时
      【解决方案4】:

      没有。那是因为 ViewBag 不是强类型的。它是使用动态和 ExpandoObject 实现的。如果你需要一个强类型模型,为什么不使用呢?

      【讨论】:

      • 我已经在使用模型来为用户表单来回传递交易信息,所以没想到我可以有 2 个模型 :(
      • 你不能把你需要的数据添加到你的模型中吗?你在使用视图模型吗?
      • 使用 ViewModels 是个好主意(通常),但如果您需要使用来自多个模型的实体,则它是“必需的”。
      • 电影实际上保存在实体框架对象中。另一个保存在视图模型(用户事务)中。我正在使用设置了验证标志的用户事务模型进行验证。当我将它们结合起来时,我无法正确触发验证。因此,将一个放入 viewbag :|抱歉还在这里学习:)
      猜你喜欢
      • 2015-10-22
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多