2015-09-04 95 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>