3

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>
}

しかし、オブジェクトコースに名前の定義がないというエラーが表示されます。デバッガーは値を提供し、すべてを正しく表示します。これを機能させる方法はありますか?(私はすでに回避策を持っています。むしろこれを使用したいだけです)。

前もって感謝します。

4

2 に答える 2

7

個人的には、次の方法で解決します。

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' ?」、...)、生成しているコードで作業する必要がある人が他にいるかどうかを無視します。

于 2012-04-23T01:03:42.387 に答える
2

Brad Christie の ViewModel アプローチはより健全です。コンパイラは、エラーの修正にコストがかかる場合、つまり実行時ではなく、View のエラーを早期に検出できます。一方、動的を使用した場合は、基本的に自分でできます。また、匿名型で dynamic を実行しても機能しません。匿名型を dynamic に永続化しようとしたことがありますが、これは醜いハックではありません。しかし、ビューモデルを介して行うことができる代わりに、ビューのエラーを早期にキャッチしたいと考えています。

それでも動的を使用したい場合は、コントローラーからビューに匿名の値を永続化するための優れたシリアライザーが必要です。コントローラーでこれを行います。

 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

于 2012-04-23T01:23:00.720 に答える