使用ViewBag作为对象

时间:2015-11-05 13:42:11

标签: c# .net asp.net-mvc asp.net-mvc-4

如果我在控制器

中有多个ViewBag行
ViewBag.ShowElement1 = myObj.IsAllowed;
ViewBag.PageLabel = someotherObj.PersonName;
....

我当然使用内部视图来访问某些值我想知道是否有更好的解决方案将它包装成1个逻辑片段所以我可以访问内部视图,如

ViewBag.MyRestricts.ShowElement1
ViewBag.MyRestricts.ShowElement8

4 个答案:

答案 0 :(得分:3)

最佳解决方案是,如果您要创建 ViewModel 并添加查看所需的任何内容。然后使用模型创建强类型视图您的ViewModel。

一个视图 - 一个ViewModel 。您的视图需要它的任何内容必须在ViewModel中

有一些规则。

规则#1 - 所有视图都是强类型的,规则#2 - 对于每个ViewModel类型,只定义一个强类型           查看
规则#3 - 视图决定了ViewModel的设计。只需要什么           使用ViewModel传递视图。
规则#4 - ViewModel仅包含与视图相关的数据和行为

enter image description here

这是一个很好的帖子。我认为这对你来说很有意义 https://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

答案 1 :(得分:0)

为什么不使用ViewModel?您可以使用ShowElement1和PageLabel等属性定义一个类,然后在视图中通过在顶部添加此行来访问它:

@model TheTypeOfYourClass

然后您可以使用@Model.PageLabel访问该媒体资源。

答案 2 :(得分:0)

正如之前所说的,最好的解决方案是使用ViewModel,因为使用沉重的视图被认为是不好的做法。你可以阅读这个here,我完全赞同这篇文章:

以下是Viewmodel的样子:

namespace MyProject.Models
{
    public class MyViewModel
    {
        public bool ShowElement1 { get; set; }
        public string PageLabel { get; set; }
    }
}

这是控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            ShowElement1 = myObj.IsAllowed,
            PageLabel = someotherObj.PersonName
        };

        return View(model);
    }
}

您的观点将是这样的:

@model MyProject.Models.MyViewModel

<p>ShowElement1 value: @Model.ShowElement1</p> 
<p>PageLabel value: @Model.PageLabel </p> 

答案 3 :(得分:-1)

您可以使用匿名对象

ViewBag.MyRestricts = new { ShowElement1 = true, ShowElement2 = false, }; 

或者你可以为那个

创建一个类
public class Restricts
{
    public bool ShowElement1 { get; set; }
    public bool ShowElement8 { get; set; }
} 
ViewBag.MyRestricts = new Restricts { ShowElement1 = true, ShowElement2 = false, }; 

并在您的视图中

var restricts = (Restricts)ViewBag.MyRestricts;
if (restricts.ShowElement1)
    ....