2012-04-23 120 views
3

我正在使用ASP.NET MVC Razor視圖引擎,並且我正在嘗試使用Viewbag。以下代碼不適用於我。在控制器我有如何獲得ASP.NET MVC中的ViewBag值?

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

,然後在視圖中我有

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

但它給了我一個錯誤說對象當然不具有名稱的定義。調試器給我的價值,並正確顯示一切。有什麼辦法讓這個工作? (我已經有了解決方法,我只是寧願使用這個)。

在此先感謝。

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> 
@* ... *@ 

使用的模型,這就是整點

+1

你不能傳遞一個視圖模型,因爲...(動態變量_that_程度上會只是給你帶來麻煩和b當涉及到稍後的更新/重構時,它將成爲你的致命弱點)。 – 2012-04-23 00:57:26

回答

7

就個人而言,我會使用以下解決問題的MVC是。它使生活變得如此簡單,更不用說可以應用於模型的屬性來進一步自定義模型的顯示方式(模板等)。 [Ab]使用dynamic你現在的方式就是將你的網站借給未來的問題,而不是提到一堆來回的貓捉老鼠(「我命名那個屬性是什麼?」,「什麼值類型是'foo'了嗎?「,...),忽略了是否有其他人需要處理你正在生成的代碼。

2

Brad Christie的ViewModel方法更加合理,編譯器可以在您的View中更早地捕獲錯誤,而不是在修復錯誤時(即運行時)更昂貴;而如果你使用動態,你基本上是你自己的。做匿名類型的動態也不行,說我曾試過persisting anonymous types to dynamic,這不是一個醜陋的黑客;但我仍然希望我的視圖錯誤被更早地捕獲,可以通過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序列化是序列化需要一個很好的選擇,它可以模擬整個對象圖

的JSON序列化組件我用:http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx