2009-05-21 55 views
3

我似乎無法找到一篇很好的博客文章,其中展示瞭如何將模型綁定到視圖,而不使用魔術字符串「ViewData」(強烈使用我試圖採取的方式)如何在沒有ViewData的情況下綁定Html.DropDownList(強類型視圖)

有沒有人知道我需要改變在下面直接綁定到我的模型?

查看

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of IEnumerable (Of MvcApplication1.Category))" %> 
<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <%=Html.DropDownList("CategoryList")%> 
</asp:Content> 

控制器

Function Index() As ActionResult 
    Dim list As New List(Of Category) 
    list.Add(New Category With {.CategoryID = 1, .CategoryName = "Test1"}) 
    list.Add(New Category With {.CategoryID = 2, .CategoryName = "Test2"}) 

    Return View() 
End Function 

編輯

在VB最終的解決方案如下所示,感謝大的反響!

控制器

Function Index() As ActionResult 
    Dim id As Integer = 1 
    Dim ProductObject As Product = mProductService.GetProductById(id) 

    Return View(ProductObject) 
End Function 

查看

<%=Html.DropDownList("Category", New SelectList(Model.Categories, "CategoryID", "CategoryName"))%> 

產品類別(W/A IEnumeralbe屬性的類別)

Public Class Product 
    Public Sub New() 

    End Sub 


    Private mProductID As Integer 
    Public Property ProductID() As Integer 
     Get 
      Return mProductID 
     End Get 
     Set(ByVal value As Integer) 
      mProductID = value 
     End Set 
    End Property 

    ReadOnly Property Categories() As IEnumerable(Of Category) 
     Get 
      Dim list As New List(Of Category) 
      list.Add(New Category With {.CategoryID = 1, .CategoryName = "Test1"}) 
      list.Add(New Category With {.CategoryID = 2, .CategoryName = "Test2"}) 

      Return list 
     End Get 
    End Property 

End Class 

回答

5

下拉列表助手需要一個IEnumerable<SelectListItem>,而不是一個IEnumerable<Category>調用它。通常你所做的就是讓你的頁面有一個特定的模型。該模型包含從下拉列表中選定值的屬性,而不是集合。您可以通過ViewData提供要從中進行選擇的集合。您可以有一個只包含屬性和集合的可視模型,但這可能意味着類的泛濫。關於增殖類或魔法弦是否更差的設計存在一些爭議。

我對你的代碼採取會是這樣:

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Foo)" %> 
<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <%=Html.DropDownList("Category", ViewData("CategoryList"))%> 
</asp:Content> 

Function Index() As ActionResult 
    Dim list As New List(Of SelectListItem) 
    list.Add(New SelectListItem With {.Value = 1, .Text = "Test1"}) 
    list.Add(New SelectListItem With {.Value = 2, .Text = "Test2"}) 
    ViewData("CategoryList") = list 
    Return View() 
End Function 

其中foo是包含int類型的屬性類別的類。

如果你想做一個強類型的視圖,然後讓富有型SelectListItem的屬性分類,然後更改:

<%=Html.DropDownList("Category", ViewData("CategoryList"))%> 

<%=Html.DropDownList("Category", Foo.Categories)%> 

ViewData("CategoryList") = list 
    Return View() 

Dim foo as New Foo 
    foo.Categories = list 
    Return View(foo) 
1

您可以爲Html.DropDownList創建您自己的幫助程序方法重載,它將直接將模型映射到DropDownList助手。

這就是說,你應該問你自己多少特定於領域的邏輯你的觀點應該包含。 ViewData有助於將您的模型和域邏輯從視圖中分離出來。

例子:

我知道這是不是「過載」,因爲覺得,因爲這仍然需要一個名字,你想其他,只是需要一個字符串下拉的名稱的方法,但自動綁定模型到控件(假設它是一個IEnumerable)。這是HtmlHelper擴展方法的一個例子。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

namespace MvcApplication3.Helpers 
{ 
    public static class ViewHelpers 
    { 
     public static string ModelDropDownList(this HtmlHelper htmlHelper, string name) 
     { 
      var model = htmlHelper.ViewData.Model as IEnumerable<SelectListItem>; 
      if(model == null) 
       return string.Empty; 

      return htmlHelper.DropDownList(name, model); 
     } 
    } 
} 

這裏是你將如何在你看來

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<SelectListItem>>" %> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <%= Html.ModelDropDownList("Test") %> 
</asp:Content> 
+0

公平的,我可以混合ViewData(「列表」)與模型,因爲我有時有一個強類型視圖來填充表/ etc,但我需要填充下拉列表。我是否能夠在相同的觀點都能做到這一點? – 2009-05-21 02:25:01

+1

是因爲這僅僅是一個超負荷簡單的API,但標準的方法簽名將仍然存在。 – 2009-05-21 02:27:10

0

如果你想要去的強類型的方法,有一個的SelectList對象,你可以通過一個IEnumerable。您可以指定T的文本字段和值字段屬性,但這種的SelectList對象可以直接分配給Html.DropDownList幫手:

c# 
IList<Category> categories = new IList<Category>() 
    { 
     new Category() { ID = 1, Name = "Category 1" }, 
     new Category { ID = 2, Name = "Category 2" } 
    }; 

SelectList categoryDropDown = new SelectList(categories, "ID", "Name"); 

ViewData["categoryDropDown"] = categoryDropDown; 

然後執行:

c# 
<%=Html.DropDownList("CategoryID", ViewData("categoryDropDown"))%> 

這樣,你可以通過在類別從任何地方(服務層,控制器寬法)一個IList。

相關問題