首页 文章

ViewData和ViewBag有什么区别?

提问于
浏览
302

我在MVC 3中看到了 ViewBag . 与MVC 2中的 ViewData 有什么不同?

16 回答

  • 0

    View Data

    • ViewData用于将数据从控制器传递到视图

    • ViewData派生自ViewDataDictionary类,基本上是一个Dictionary对象,即Keys和Values,其中Keys是String,而Values是对象 .

    • 从ViewData中检索数据时需要数据预测,因为它的数据类型为对象,并且还需要null vvalue检查类型转换,否则会破坏应用程序 . 如果发生重定向,则其值变为null读取TempData ViewData和View Bag之间的完全差异

    http://www.gurujipoint.com/2017/09/view-data-viewbag-and-tempdata.html

  • -1

    它使用C#4.0动态功能 . 它实现了与viewdata相同的目标,应该避免使用强类型视图模型(应该避免使用与viewdata相同的方式) .

    所以基本上它取代了魔术字符串:

    ViewData["Foo"]
    

    具有魔力属性:

    ViewBag.Foo
    

    你没有编译时的安全性 .

    我继续责怪微软在MVC中引入这个概念 .

    属性的名称区分大小写 .

  • 357

    内部 ViewBag 属性在 ViewData dictionary 中存储为名称/值对 .

    注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel,如MVC 3发行说明中的片段中所述:

    (edited 10-8-12) 有人建议我发布我发布的这个信息的来源,这里是来源:http://www.asp.net/whitepapers/mvc3-release-notes#_Toc2_4

    MVC 2控制器支持ViewData属性,使您可以使用后期绑定字典API将数据传递到视图模板 . 在MVC 3中,您还可以使用ViewBag属性稍微简单的语法来实现相同的目的 . 例如,您可以编写ViewBag.Message =“text”,而不是编写ViewData [“Message”] =“text” . 您不需要定义任何强类型类来使用ViewBag属性 . 因为它是动态属性,所以您只需获取或设置属性,它将在运行时动态解析它们 . 在内部,ViewBag属性作为名称/值对存储在ViewData字典中 . (注意:在MVC 3的大多数预发布版本中,ViewBag属性被命名为ViewModel属性 . )

  • 0

    ViewBag vs ViewData in MVC

    http://royalarun.blogspot.in/2013/08/viewbag-viewdata-tempdata-and-view.html

    Similarities between ViewBag & ViewData :

    当您从控制器移动到视图时,帮助维护数据 . 用于将数据从控制器传递到相应的视图 . 短寿命意味着当重定向发生时,值变为空 . 这是因为他们的目标是提供一种在控制器和视图之间进行通信的方法 . 它是服务器调用中的通信机制 .

    Difference between ViewBag & ViewData:

    ViewData是一个对象字典,它派生自ViewDataDictionary类,可以使用字符串作为键进行访问 . ViewBag是一个动态属性,它利用了C#4.0中的新动态功能 . ViewData需要对复杂数据类型进行类型转换,并检查空值以避免错误 . ViewBag不需要对复杂数据类型进行类型转换 .

    ViewBag & ViewData Example:

    public ActionResult Index()
    {   
        ViewBag.Name = "Arun Prakash";   
        return View();
    }
    
    public ActionResult Index()
    {  
        ViewData["Name"] = "Arun Prakash";  
        return View();
    }
    

    在视野中呼唤

    @ViewBag.Name    
    @ViewData["Name"]
    
  • 13

    ViewData :复杂数据类型需要类型转换,并检查空值以避免错误 .

    ViewBag :复杂数据类型不需要类型转换 .

    请考虑以下示例:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var emp = new Employee
            {
                EmpID=101,
                Name = "Deepak",
                Salary = 35000,
                Address = "Delhi"
            };
    
            ViewData["emp"] = emp;
            ViewBag.Employee = emp;
    
            return View(); 
        }
    }
    

    View 的代码如下:

    @model MyProject.Models.EmpModel;
    @{ 
     Layout = "~/Views/Shared/_Layout.cshtml"; 
     ViewBag.Title = "Welcome to Home Page";
     var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
    }
    
    <h2>Welcome to Home Page</h2>
    This Year Best Employee is!
    <h4>@ViewBag.Employee.Name</h4>
    <h3>@viewDataEmployee.Name</h3>
    
  • 0

    所有答案都表明 ViewBag 和/或 ViewData 将数据从 Controller 传递给 Views ,这是错误的信息 . 两者都非常有用,可以将数据从视图传递到布局或部分传递到视图(或ViewComponents等) . 它不是控制器独占的 .

    作为默认的asp.net示例在布局页面中有这个:

    <title>@ViewData["Title"] - MyApp</title>
    

    在任何观点

    ViewData["Title"] = "Details";
    

    那么,问一下这个问题:“ ViewBagViewData 之间有什么区别?”

    最显着的区别是 ViewData 是强类型字典,而 ViewBag 是动态类型 .

    请注意 IS THE SAME 中的数据

    ViewData["Title"] = "MyTitle";
    ViewBag.Title; // returns "MyTitle";
    

    什么时候使用?

    • ViewBag 不能't support not valid C# names. you can' t使用 ViewBag 访问 ViewData["Key With Space"]

    • ViewBag.Something 是动态的,在调用需要在编译时知道确切参数的方法(如扩展方法)时可能会遇到问题 .

    • ViewBag 可以检查空语句清除器: ViewBag.Person?.Name

    • ViewData 具有字典的所有属性,如 ContainsKeyAdd 等,因此您可以使用 ViewData.Add("somekey", "somevalue") 请记住它可能会抛出异常 .

    • 在视图上使用 ViewData 需要TypeCasting而 ViewBag 不需要 .

    了解细微的差异,使用一个或另一个更多的是品味偏好 .

    通常您可以将 ViewBag.AnyKey 视为 ViewData["AnyKey"] 的别名

  • 0

    我可以建议您不要使用吗?

    如果要将数据“发送”到屏幕,请发送强类型对象(A.K.A.ViewModel),因为它更容易测试 .

    如果你绑定到某种“模型”并具有随机的“viewbag”或“viewdata”项目,那么它使自动化测试变得非常困难 .

    如果您正在使用这些,请考虑如何重组和只需使用ViewModels .

  • 26

    有一些微妙的差异意味着您可以使用与视图略有不同的ViewData和ViewBag . 在这篇文章http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx中概述了一个优点,并且通过使用ViewBag而不是ViewData可以避免在示例中进行强制转换 .

  • 33

    viewdata: 是用于在View和控制器之间存储数据的字典,你需要将视图数据对象转换为视图中的相应模型,以便能够从中检索数据...

    ViewBag: 是一个动态属性,类似于它对视图数据的工作,但是它更好,因为在视图中使用它之前不需要将其转换为其corressponding模型...

  • 41
    public ActionResult Index()
    {
        ViewBag.Name = "Monjurul Habib";
        return View();
    }
    
    public ActionResult Index()
    {
        ViewData["Name"] = "Monjurul Habib";
        return View();
    } 
    
    In View:
    
    @ViewBag.Name 
    @ViewData["Name"]
    
  • 11

    通过这种方式,我们可以使用值来将控制器之间的信息传递给具有TEMP DATA的其他页面

  • 0

    虽然选择一种格式而不是另一种格式可能没有技术优势,但您应该注意两种语法之间的一些重要差异 . 一个明显的区别是ViewBag仅在您访问的密钥是有效的C#标识符时才起作用 . 例如,如果在ViewData [“Key With Spaces”]中放置一个值,则无法使用ViewBag访问该值,因为代码将无法编译 . 另一个需要考虑的关键问题是您不能将动态值作为参数传递给扩展方法 . C#编译器必须在编译时知道每个参数的实际类型,以便选择正确的扩展方法 . 如果任何参数是动态的,则编译将失败 . 例如,此代码将始终失败:@ Html.TextBox(“name”,ViewBag.Name) . 要解决此问题,请使用ViewData [“Name”]或转换va

  • 0

    我注意到ViewData和ViewBag之间的一个主要区别是:

    ViewData:它将返回对象并不重要你已经分配到这个并且需要再次类型转换回原始类型 .

    ViewBag:它足够聪明地返回您分配给它的确切类型,无论您分配简单类型(即int,string等)或复杂类型的天气 .

    Ex: Controller code.

    namespace WebApplication1.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                Products p1 = new Products();
                p1.productId = 101;
                p1.productName = "Phone";
                Products p2 = new Products();
                p2.productId = 102;
                p2.productName = "laptop";
    
                List<Products> products = new List<Products>();
                products.Add(p1);
                products.Add(p2);
                ViewBag.Countries = products;
                return View();
            }
        }
        public class Products
        {
            public int productId { get; set; }
            public string productName { get; set; }
        }
    }
    

    View Code.

    <ul>
                @foreach (WebApplication1.Controllers.Products item in ViewBag.Countries)
                {
                <li>@item.productId &nbsp;&nbsp;&nbsp;@item.productName</li>
                }
            </ul>
    

    OutPut Screen.

    enter image description here

  • 19

    ViewData的

    • ViewData用于将数据从控制器传递到视图

    • 它派生自ViewDataDictionary类

    • 仅适用于当前请求

    • 需要对复杂数据类型进行类型转换,并检查空值以避免错误

    • 如果发生重定向,则其值变为null

    ViewBag

    • ViewBag还用于将数据从控制器传递到相应的视图

    • ViewBag是一个动态属性,它利用了C#4.0中的新动态功能

    • 它也仅适用于当前请求

    • 如果发生重定向,则其值变为null

    • 不需要对复杂数据类型进行类型转换

  • 0

    这里 ViewDataViewBag 都用于将数据从 Controller 传递到 View .

    1. ViewData

    • ViewData是从 ViewDataDictonary 类派生的字典对象 .

    • 数据仅允许一个请求,当页面重定向发生时,ViewData值被清除 .

    • ViewData值必须在使用前输入cate .

    Example: 在控制器中

    public ActionResult PassingDatatoViewWithViewData()
    {
          ViewData["Message"] = "This message shown in view with the ViewData";
          return View();
    }
    

    在视图中

    @ViewData["Message"];
    
    • ViewData是一对像 KeyValue ,Message是Key,倒置逗号值是Value .

    • 数据很简单,所以如果数据很复杂,那么我们就不能在这里使用类型转换 .

    public ActionResult PassingDatatoViewWithViewData()
    {
          var type= new List<string>
        {
            "MVC",
            "MVP",
            "MVVC"
        };
        ViewData["types"] = type;
        return View();
    }
    
    • 在视图中可以提取数据
    <ul>
            @foreach (var items in (List<string>)ViewData["types"])
            {
             <li>@items</li>
            }
      </ul>
    

    2. ViewBag

    --ViewBag使用ViewData周围的动态feature.ViewBag包装器 .

    • 在ViewBag中需要类型转换 .

    • 与ViewData相同,如果重定向发生,则值变为null .

    Example:

    public ActionResult PassingDatatoViewWithViewBag()
    {
              ViewData.Message = "This message shown in view with the ViewBag";
              return View();
    }
    

    在视图中

    @ViewBag.vbMessage
    
    • 对于复杂类型,请使用ViewBag
    public ActionResult PassingDatatoViewWithViewBag()
    {
              var type= new List<string>
            {
                "MVC",
                "MVP",
                "MVVC"
            };
            ViewBag.types = type;
            return View();
     }
    
    • 在视图中可以提取数据
    <ul>
           @foreach (var items in ViewBag.types)
           {
             <li>@items</li>
           }
    </ul>
    
    • 主要区别在于 ViewBag 不需要进行类型转换 ViewData 是必需的类型转换 .
  • 6

    ViewBag和ViewData是用于在ASP.Net MVC中将信息从控制器传递到视图的两种方法 . 使用这两种机制的目的是提供控制器和视图之间的通信 . 两者都有短暂的生命,一旦重定向发生,两者的值都变为null,即,一旦页面从源页面(我们设置ViewBag或ViewData的值)重定向到目标页面,ViewBag和ViewData都是变为空 .

    尽管有这些相似之处(ViewBag和ViewData),如果我们谈论两者的实现,它们是两回事 . 差异如下:

    1.)如果我们分析两种实现方式,那么我们会发现ViewData是一个字典数据结构 - 从ViewDataDictionary派生的对象字典,可以使用字符串作为这些值的键来访问,而ViewBag则使用C#4.0中引入的动态特性和是一个动态的属性 .

    2.)在从ViewData访问值时,我们需要对值(数据类型)进行类型转换,因为它们在ViewData字典中存储为对象,但是如果我们在ViewBag的情况下访问该值则没有这种需要 .

    3.)在ViewBag中,我们可以像这样设置值:

    ViewBag.Name = "Value";
    

    并可以访问如下:

    @ViewBag.Name
    

    在ViewData的情况下,可以按如下方式设置和访问值:设置ViewData,如下所示:

    ViewData["Name"] = "Value";
    

    和访问这样的 Value

    @ViewData["Name"]
    

    详情click here:

相关问题