2013-01-12 99 views
4

我對MVC相當新,並想知道在我的編輯器模板中填充下拉的最佳方法?MVC4 DropDownListFor從數據庫或代碼枚舉的最佳做法

我正在構建一個應用程序,它有很多下拉列表,這些下拉列表的數據是非常靜態的。目前,我將它們全部放在db中的表中,然後將它們加載到會話中。

下面是一個例子:

我的觀點:

@{ 
     var widgettypes = Business.MySession.Current.WidgetTypes.ToSelectList(d => d.TypeName, 
            d => d.WidgetTypeID.ToString(), 
            " - Select - "); 
    } 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.WidgetTypeID) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.WidgetTypeID, @widgettypes) 
     @Html.ValidationMessageFor(model => model.WidgetTypeID) 
    </div> 

下拉助手:

public static List<SelectListItem> ToSelectList<T>(
      this IEnumerable<T> enumerable, 
      Func<T, string> text, 
      Func<T, string> value, 
      string defaultOption) 
    { 
     var items = enumerable.Select(f => new SelectListItem() 
     { 
      Text = text(f), 
      Value = value(f) 
     }).ToList(); 
     items.Insert(0, new SelectListItem() 
     { 
      Text = defaultOption, 
      Value = "-1" 
     }); 
     return items; 
    } 

我見過的例子很多在這裏,使節目製作選擇列表在視圖中靜態。

最好的做法是在靜態枚舉的.net代碼的視圖中創建它們,還是最好現在就這樣做呢?或者它只是無關緊要?

我只想知道我應該做什麼,而不是什麼正常工作。

回答

6

我個人認爲數據庫驅動是最好的選擇。主要根據經驗,假設您想要在查找中添加一個值,並且您已經部署了應用程序,那麼在將新值添加到Enum之後,您必須重新部署代碼。在數據庫驅動的情況下,您只需對數據庫運行插入查詢,不需要重新部署。

雖然我不會在你的視圖中調用你的數據庫,但我不會說這是最佳實踐,因爲這不是視圖的責任,它只需顯示數據,而不是查詢其他數據。

首先,把你希望你的項目在下拉列表中的模型,像這樣:

public class YourModel 
{ 
    public int WidgetTypeId { get; set; } 
    public SelectList WidgetTypes { get; set; } 
    //...rest of your model 
} 

然後,在你的控制器的GET方法(返回你的看法之前,填充在該列表代碼必須在視圖中:

public ActionResult MyAction() 
{ 
    YourModel model = new YourModel(); 

    model.WidgetTypes = Business.MySession.Current.WidgetTypes 
     .ToSelectList(d => d.TypeName, d => d.WidgetTypeID.ToString(), " - Select - "); 

    return View(model); 
} 
在你看來

然後就去做:

@Html.DropDownListFor(model => model.WidgetTypeID, Model.WidgetTypes) 
+0

好了,感謝您的SOLU灰。我想我唯一真正的問題是,我正在開發的應用程序有大約90多種不同的表單,這意味着我必須爲每個表單編寫自定義的Get()方法,而且它會有相當多的工作......等等。我知道從視圖(或editortemplate)加載是錯誤的,但對於我來說有更少的代碼,因爲有些表單會共享模板。 –

+0

此外,我還有一個問題 - 如果我將EditorTemplate直接綁定到實體框架POCO模型 - 我現在已經爲每個模型創建視圖模型,然後通過我的控制器將它們實例化......如何更好地實現解?我看到的唯一優點是充分分離關注點。 –

+0

我看到的另一個問題 - 我現在必須反駁我的EF poco和模型實例之間的副本......惡作劇! –