2015-09-04 46 views
1

我有一個非常基本的web應用程序,顯示錶格的內容。用戶可以通過點擊鏈接來改變一些參數。 爲簡化起見,我們只考慮一個簡單的例子,即用於排序行的列的名稱。MVC視圖直接與模型交互 - 好還是壞?

用戶可以單擊列或從右側欄選擇列的名稱以更改排序。 我使用<option>元素來顯示可用列名稱的列表。

Model對象直接取這些名字是正確的,還是我應該以某種方式從Controller傳遞它們?這是代碼現在

<select> 
    @{ 
     // get list of all properties names 
     List<string> EtlProceduresNames = (((new MIPortal.Models.EtlProcedure()).GetType().GetProperties()).Select(item => item.Name)).ToList(); 
     // display an option item for each property name 
     foreach (string EtlProceduresName in EtlProceduresNames) { 
      <option [email protected] >@Html.DisplayName(EtlProceduresName)</option> 
     } 
    } 
</select> 

這樣,ViewModel直接交互。這是一個概念錯誤嗎?我是否應該將該代碼放在Controller上,然後將名稱列表存儲在ViewBag對象上?

+0

你不想打破觀念mvc模式的所有邏輯都會在控制器中存儲它,並將模型傳遞到視圖中,網絡中有很多示例。 – DarkVision

回答

0

例子我可以建議你使用所謂的ViewBag注射。 您需要爲數據聲明一個操作篩選器屬性類。

public class EtlProceduresNamesAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //you can add some caching here 
     filterContext.Controller.ViewBag.EtlProcedures = (new MIPortal.Models.EtlProcedure()).GetType().GetProperties()).Select(item => item.Name)).ToList(); 
    } 
} 

所有你註釋與此屬性的視圖操作,例如

[EtlProceduresNames] 
public ActionResult Action() 
{ 
    return View(); 
} 

您需要更換您查看代碼

<select> 
    @foreach (string EtlProceduresName in ViewBag.EtlProceduresNames) 
    { 
     <option [email protected] >@Html.DisplayName(EtlProceduresName)</option> 
    } 
</select>