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

本文关键字:ViewBag ASP NET 获取 MVC | 更新日期: 2023-09-27 18:31:53

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

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

提前谢谢。

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

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

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方法更合理,编译器可以更早地捕获视图中的错误,而不是在修复错误更昂贵的时候,即在运行时;而如果你使用动态,你基本上是靠自己。在匿名类型上做动态也行不通,话虽如此,我曾经尝试过将匿名类型持久化为动态,这不是一个丑陋的黑客;但我仍然希望我的视图错误更早地被发现,可以通过 ViewModel 完成。

如果仍想使用动态,则只需要一个好的序列化程序即可将匿名值从控制器保存到视图。您将在控制器上执行此操作:

 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 序列化程序组件:http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx