繁体   English   中英

如何在ASP.NET MVC中获取ViewBag值?

[英]How can I get ViewBag value in ASP.NET MVC ?

我正在使用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>
}

但它给我一个错误,说对象课程没有Name的定义。 调试器为我提供了值,并正确显示了所有内容。 有没有办法让这个工作? (我已经有一个解决方法,我只是想用它)。

提前致谢。

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

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'?“,...),忽略了是否有其他人需要处理您正在生成的代码。

Brad Christie的ViewModel方法更健全,编译器可以更早地捕获View中的错误,而不是在修复错误时更加昂贵,即在运行时; 而如果你使用动态,你基本上是靠自己。 并且在匿名类型上做动态也不会有用,说过我曾经尝试过将匿名类型保持为动态 ,这不是一个丑陋的黑客; 但是我仍然想要更早地捕获我的Views错误,可以通过ViewModel完成。

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

 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM