ASP.NET MVC中使用DropDownList

来源:http://www.cnblogs.com/rancrazy/archive/2016/08/19/5787747.html
-Advertisement-
Play Games

在ASP.NET MVC中,儘管我們可以直接在頁面中編寫HTML控制項,並綁定控制項的屬性,但更方便的辦法還是使用HtmlHelper中的輔助方法。在View中,包含一個類型為HtmlHelper的屬性Html,它為我們呈現控制項提供了捷徑。 我們今天主要來討論Html.DropDownList的用法,首 ...


在ASP.NET MVC中,儘管我們可以直接在頁面中編寫HTML控制項,並綁定控制項的屬性,但更方便的辦法還是使用HtmlHelper中的輔助方法。在View中,包含一個類型為HtmlHelper的屬性Html,它為我們呈現控制項提供了捷徑。

我們今天主要來討論Html.DropDownList的用法,首先從Html.TextBox開始。

Html.TextBox有一個重載方法形式如下:

public static string TextBox(this HtmlHelper htmlHelper, string name, object value);

其中name參數為文本框name屬性(以及id屬性)的值,value參數為文本框的預設值(即value屬性的值)。如果value參數為null或者使用沒有value參數的重載方法,那麼此時name參數同時還是一個鍵值,負責獲取文本框的預設值。獲取的順序為,先從ViewData中查找是否存在鍵值為name值的項,如果ViewData中沒有則從ViewData.Model中查找是否存在名稱為name值的屬性,如果仍然不存在,則返回null。(具體參見HtmlHelper的InputHelper輔助方法)

也就是說

public ActionResult Test()
{
    ViewData["Name"] = "Jade";
    return View();
}

 

<%= Html.TextBox("Name")%>

這樣的代碼將會輸出這樣的HTML:

<input id="Name" name="Name" type="text" value="Jade" />

 

由於TextBox的id和name屬性的值與ViewData中的某一項同名(均為Name),因此TextBox的value屬性的值將自動綁定為ViewData中Name項的值。不僅是ViewData,如果view model的類型包含Name屬性,也將輸出同樣的結果:

var user = new User { Name = "Jade" };
ViewData.Model = user;
return View();

 

如果ViewData和ViewData.Model中同時存在Name,則優先使用ViewData中的項。

CheckBox、Hidden、Password、RedioButton等控制項也是如此,它們與TextBox一樣都使用input標記,屬性綁定的規則大致相同。

DropDownList則與TextBox等控制項不同,它使用的是select標記。它需要兩個值:在下拉框中顯示的列表,和預設選項。而自動綁定一次只能綁定一個屬性,因此你需要根據需要選擇是綁定列表,還是預設選項。

DropDownList擴展方法的各個重載版本“基本上”都會傳遞到這個方法上:

public static string DropDownList(this HtmlHelper htmlHelper, 
    string name, 
    IEnumerable<SelectListItem> selectList, 
    string optionLabel, 
    IDictionary<string, object> htmlAttributes) {
    
}

 

如果沒有指定selectList,該方法將自動綁定列表,即從ViewData中查找name所對應的值。如果提供了selectList,將自動綁定預設選項,即從selectList中找到Selected屬性為true的SelectedListItem。(具體參見HtmlHelper方法的SelectInternal輔助方法)

例1:如果在Action方法中有如下代碼:

List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "Kirin", Value = "29" });
items.Add(new SelectListItem { Text = "Jade", Value = "28", Selected = true});
items.Add(new SelectListItem { Text = "Yao", Value = "24"});
this.ViewData["list"] = items;

在View中這樣使用:

<%=Html.DropDownList("list")%>

那麼輔助方法將率先從ViewData中獲取key為list的項,如果該項為IEnumerable<SelectedListItem>類型則綁定到下拉框中,否則將拋出InvalidOperationException。由於第二個SelectListItem的Selected為true,則預設選中第二個。

例2:如果Action中代碼如下:

List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "Kirin", Value = "29" });
items.Add(new SelectListItem { Text = "Jade", Value = "28"});
items.Add(new SelectListItem { Text = "Yao", Value = "24"});
this.ViewData["list"] = items;
this.ViewData["selected"] = 24;

View中的代碼如下:

<%=Html.DropDownList("selected", ViewData["list"] as IEnumerable<SelectListItem>)%>

那麼輔助方法將ViewData["list"]綁定為下拉框,然後從ViewData中獲取key為selected的項,並將下list中Value值與該項的值相等的SelecteListItem設為預設選中項。

以上兩種方法儘管可以實現DropDownList的正確顯示,但並非最佳實踐。在實際項目中,我們更希望在代碼中使用強類型。例如上面兩例中,SelectListItem的Text和Value本來是User對象的Name和Age屬性,然而上面的代碼卻絲毫體現不出這種對應關係。如果User列表是從資料庫或其他外部資源中獲得的,我們難道要用這樣的方式來綁定嗎?

var users = GetUsers();
foreach (var user in users)
{
    items.Add(new SelectListItem { Text = user.Name, Value = user.Age.ToString() });
}

這顯然是我們所無法容忍的。那麼什麼是最佳實踐呢?

ASP.NET MVC為DropDownList和ListBox(都在html中使用select標記)準備了一個輔助類型:SelectList。SelectList繼承自MultiSelectList,而後者實現了IEnumerable<SelectListItem>。也就是說,SelectList可以直接作為Html.DropDownList方法的第二個參數。

MultiSelectList包含四個屬性,分別為:

  • Items:用於在select標記中出現的列表,通常使用option標記表示。IEnumerable類型。
  • DataTextField:作為option的text項,string類型。
  • DataValueField:作為option的value項,string類型。
  • SelectedValues:選中項的value值,IEnumerable類型。

顯然,作為DropDownList來說,選中項不可能為IEnumerable,因此SelectList提供了一個新的屬性:

  • SelectedValue:選中項的value值,object類型。

同時,SelectList的構造函數如下所示:

public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue)
    : base(items, dataValueField, dataTextField, ToEnumerable(selectedValue)) {
    SelectedValue = selectedValue;
}

 

於是我們的代碼變為:

var users = GetUsers();
var selectList = new SelectList(users, "Age", "Name", "24");
this.ViewData["list"] = selectList;

 

<%=Html.DropDownList("list")%>

 

當然,你也可以使用不帶selectedValue參數的構造函數重載,而在view中顯式指定IEnumerable<SelectListItem>,併在ViewData或view model中指定其他與DropDownList同名的項作為預設選項。

最後讓我們來回顧一下DropDownList的三種用法:

  1. 建立IEnumerable<SelectListItem>併在其中指定預設選中項。
  2. 建立IEnumerable<SelectListItem>,在單獨的ViewData項或view model的屬性中指定預設選中項。
  3. 使用SelectList。
  4. 到此結束
  5. 原創作者:麒麟.NET

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本隨筆續接:.NET 實現並行的幾種方式(一) 四、Task 3)Task.NET 4.5 中的簡易方式 在上篇隨筆中,兩個Demo使用的是 .NET 4.0 中的方式,代碼寫起來略顯麻煩,這不 .NET 4.5提供了更加簡潔的方式,讓我們來看一下吧。 /// <summary> /// Task. ...
  • 二三四五還沒寫,先寫六吧(有道友說想看看插件部分)。 這裡是一 從零開始編寫屬於我的CMS:(一)前言 一,首先預定義介面<!--?xml:namespace prefix = "o" ns = "urn:schemas-microsoft-com:office:office" /--> 新建類庫, ...
  • 從本節開始,我們使用SharpGL帶的VS2010擴展,來直接生成SharpGL工程。 如果你新建項目時,沒有看到下麵的SharpGL項目,那麼請事先在SharpGL源代碼中找到一個叫 ”SharpGL 2.0 Visual Studio Extension“目錄 ,安裝名為 SharpGL.vsi ...
  • 驗證碼在軟體中的地位越來越重要,有效防止這種問題對某一個特定註冊用戶用特定程式暴力破解方式進行不斷的登陸嘗試;下麵就是實現驗證碼的基本步驟: 1.在MVC框架中,則需添加一個控制器,代碼如下 前端頁面代碼也簡單,在index添加一個視圖即可 最後在運行時展示的是這樣的一個頁面,而且點擊圖片會實現更新 ...
  • 安裝運行環境 sudoyuminstall libunwind libicu 下載.net core https://www.microsoft.com/net/download 下載完後上傳文件 安裝步驟https://www.microsoft.com/net/core#centos 安裝如下 ...
  • 最近做項目的時候 用戶提出要上傳大圖片 一張圖片有可能十幾兆 本來用的第三方的上傳控制項 有限製圖片上傳大小的設置 以前設置的是2M 按照用戶的要求 以為直接將限製圖片上傳大小的設置改下就可以了 但是當上傳大圖片的時 總是異常: 錯誤消息:超過了最大請求長度 解決方案: 錯誤原因:asp.net預設最 ...
  • 一、單元測試是什麼 單元測試(unit testing),是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數,C#里單元指一個類,圖形化的軟體中可以指一個視窗或一個菜單等。總的來說,單元就是人為規定的最小的被測功能 ...
  • 第一步,建立一個類庫,並且安裝好EntityFramework框架還有CodingFirstUsingFluentApi安裝包 第二步 : 第三步:配置好你的資料庫連接信息,還有你需要操作的資料庫,在確定之前,要先測試連接一下 最後會依據資料庫中的表生成各個類以及Context的操作入口,避免了你依 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...