【问题标题】:How can I get ViewBag value in ASP.NET MVC ?如何在 ASP.NET MVC 中获取 ViewBag 值?
【发布时间】:2012-04-23 00:13:45
【问题描述】:

我正在使用 ASP.NET MVC Razor 视图引擎,并且正在尝试使用 Viewbag。以下代码对我不起作用。在控制器中我有

ViewBag.courses = new List<dynamic>();
ViewBag.courses.Add(new { Name = "Math" });

然后在我的视图中

@foreach(dynamic course in ViewBag.courses)
{
    <li>@course.Name</li>
}

但是它给了我一个错误,说对象课程没有名称的定义。调试器为我提供了值,并正确显示了所有内容。有什么办法可以让它工作吗? (我已经有一个解决方法,我宁愿使用它)。

提前致谢。

【问题讨论】:

  • 您没有传递视图模型,因为...(那个范围内的动态变量只会让您陷入困境并且非常稍后更新/重构时,您的阿喀琉斯之踵)。

标签: c# asp.net razor viewbag


【解决方案1】:

就个人而言,我会使用以下方法解决它:

public class Course
{
    public String Name { get; set; }
}

public class CoursesViewModel
{
    private IList<Course> courses;

    public IList<Course> Courses{
      get { return this.courses ?? (this.courses = new List<Course>()); }
      set { this.courses = value; }
    }
}

控制器:

public ActionResult Index()
{
  CoursesViewModel model = new CoursesViewModel();
  model.Courses.Add(new Course { Name = "Math" });

  return View(model: model);
}

你的看法:

@model CoursesViewModel
@* ... *@
<ul>
@foreach (Course course in Model.Courses)
{
  <li>@course.Name</li>
}
</ul>
@* ... *@

使用模型,这就是 MVC 的全部意义所在。它使生活变得如此轻松,更不用说您可以应用到模型以进一步自定义其显示方式(模板等)的属性。 [Ab]使用dynamic 的方式只是将您的网站借给未来的问题,更不用说一堆来回的猫捉老鼠(“我给那个属性起什么名字?”,“什么值类型又是 'foo'?”,...),忽略是否还有其他人需要处理您生成的代码。

【讨论】:

    【解决方案2】:

    Brad Christie 的 ViewModel 方法更可靠,编译器可以更早地捕获视图中的错误,而不是在修复错误的成本更高时,即在运行时;而如果你使用动态,你基本上是靠自己的。并且在匿名类型上做动态也行不通,我曾经说过我曾经尝试过persisting anonymous types to dynamic,这不是一个丑陋的黑客;但我仍然希望更早地发现我的视图错误,可以通过 ViewModel 完成。

    如果你仍然想使用动态,你只需要一个好的序列化器来将匿名值从 Controller 持久化到 View。您将在 Controller 上执行此操作:

     return View((object)r.JsSerialize());
    

    在你看来:

     @{ dynamic r = ((string)Model).JsDeserialize(); }
    
    
     @foreach (var item in r) {
     <tr>
      <td>
       @item.Person.Lastname
      </td>
      <td>
       @item.Person.Firstname
      </td>
      <td>
       @item.Person.FavoriteNumber
      </td>
      <td>
       <input type="checkbox" disabled="disabled" @(item.IsQualified ? "checked" : "") />
      </td>
     </tr>
    }
    

    在我的尝试中,Json Serializer 是一个很好的序列化需求候选者,它可以模仿整个对象图

    我使用的Json Serializer组件:http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      相关资源
      最近更新 更多