ASP.NET MVC3中Controller與View之間的數據傳遞總結

来源:http://www.cnblogs.com/fjptwwf/archive/2016/01/04/5091296.html
-Advertisement-
Play Games

目錄 Controller向View傳遞數據使用ViewData傳值數據使用ViewBag傳遞數據使用TampData傳遞數據使用Model傳遞數據 View向Controller傳遞數據通過Request.Form讀取表單數據通過FormCollection讀取表單數據模型綁定一、Controll...


目錄

  1. Controller向View傳遞數據
    1. 使用ViewData傳值數據
    2. 使用ViewBag傳遞數據
    3. 使用TampData傳遞數據
    4. 使用Model傳遞數據
  2. View向Controller傳遞數據
    1. 通過Request.Form讀取表單數據
    2. 通過FormCollection讀取表單數據
    3. 模型綁定

 

一、Controller向View傳遞數據

1.使用ViewData傳遞數據

我們在Controller中定義如下:

ViewData[“Message_ViewData”] = “ Hello ViewData!”; 

然後在View中讀取Controller中定義的ViewData數據,代碼如下:

@Html.Encode(ViewData["Message_ViewData"]) 

js中讀取ViewData中數據如下:

<pre name="code" class="javascript"><script type="text/javascript">  
    var viewData = '@ViewData["Message_ViewData"]';  
</script> 

2.使用ViewBag傳遞數據

我們在Controller中定義如下:

ViewBag.Message_ViewBag =  “ Hello ViewBag !”;  

然後在View中讀取Controller中定義的ViewBag數據,代碼如下:

@Html.Encode(ViewBag.Message_ViewBag)

js中讀取ViewBag中數據如下:

<script type="text/javascript">  
    var viewBag= '@ViewBag.Message_ViewBag';  
</script> 

3.使用TempData傳遞數據

我們在Controller中定義如下:

TempData[“Message”] = “Hello word!”; 

然後在View中讀取Controller中定義的TempData數據,代碼如下:

@Html.Encode(TempData["Message_TempData"]) 

js中讀取TempData中數據如下:

<script type="text/javascript">  
     var tempData = '@TempData["Message"]';  
</script> 

4.使用Model傳遞數據

首先要創建Model實體類:

    public class HelloModel  
        {  
            private string _name;  
            public string Name  
            {  
                get { return _name; }  
                set { _name = value; }  
            }  
            private string _text;  
            public string Text  
            {  
                get { return _text; }  
                set { _text = value; }  
            }  
        }  

使用Model傳遞數據的時候,通常在創建View的時候我們會選擇創建強類型View如下圖所示:

模型類下拉列表框中選中剛纔創建的HelloModel
創建強類型的View以後,View的第一行代碼如下所示:

@model Test.Models.HelloModel  

就代表了這個View使用的Model為“Test.Models.HelloModel”
然後在View中讀取Model中定義的數據,代碼如下:

@Html.Encode(Model.Name) 

js中讀取Model中數據如下:

    <script type="text/javascript">  
         var modelName = '@Model.Name';  
    </script>  

 

總結:

1. ViewData與TempData方式是弱類型的方式傳遞數據,而使用Model傳遞數據是強類型的方式。
2. ViewData與TempData是完全不同的數據類型,ViewData數據類型是ViewDataDictionary類的實例化對象,而TempData的數據類型是TempDataDictionary類的實例化對象。
3. TempData實際上保存在Session中,控制器每次執行請求時都會從Session中獲取TempData數據並刪除該Session。TempData數據只能在控制器中傳遞一次,其中的每個元素也只能被訪問一次,訪問之後會被自動刪除。
4. ViewData只能在一個Action方法中進行設置,在相關的視圖頁面讀取,只對當前視圖有效。理論上,TempData應該可以在一個Action中設置,多個頁面讀取。但是,實際上TempData中的元素被訪問一次以後就會被刪除。
5.  在MVC3開始,視圖數據可以通過ViewBag屬性訪問,在MVC2中則是使用ViewData。MVC3中保留了ViewData的使用,有關他們之間的區別可以參考這個文章。

 

二、View向Controller傳遞數據

在ASP.NET MVC中,將View中的數據傳遞到控制器中,主要通過發送表單的方式來實現。具體的方式有:

1.通過Request.Form讀取表單數據

我們在View層做如下定義:

@using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))  
{  
    @Html.TextBox("Name");  
    @Html.TextBox("Text");  
    <input type="submit" value="提交" />  
} 

註意:
HelloModelTest為對應的Action名,Home為對應的Controller名稱
然後在Controller層,通過Request.Form讀取表單數據的代碼如下所示:

    [HttpPost]  
           public ActionResult HelloModelTest()  
           {  
               string name= Request.Form["Name"];  
               string text= Request.Form["Text"];  
               return View();  
           }  

2.通過FormCollection讀取表單數據

我們在View層做如下定義:

    @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))  
    {  
        @Html.TextBox("Name");  
        @Html.TextBox("Text");  
        <input type="submit" value="提交" />  
    }  

然後在Controller層,通過FormCollection讀取表單數據的代碼如下所示:

[HttpPost]  
        public ActionResult HelloModelTest(FormCollection fc)  
        {  
            string name= fc["Name"];  
            string text  = fc["Text"];  
            return View();  
        } 

 3.模型綁定

我們在View層做如下定義:

    @using (Html.BeginForm("HelloModelTest", "Home", FormMethod.Post))  
    {  
        @Html.TextBox("Name");  
        @Html.TextBox("Text");  
        <input type="submit" value="提交" />  
    }  

預設的模型綁定

 相較於從請求中獲取表單值,下麵的Edit Action則是簡單地以一個模型對像為參數(Album):

[HttpPost]  
public ActionResult HelloModelTest( HelloModel model)  
{  
    // ...  
} 

當你的Action方法是以一個模型對象充當參數時,MVC運行時將會用模型綁定來構建該參數。預設用於模型綁定的是 DefaultModelBinder,以上述的HelloModel為例,DefaultModelBinder將會檢索出所有可用的 HelloModel屬性用於綁定模型。根據命名約定,DefaultModelBinder能夠自動地在請求中獲取相應的值來填充HelloModel 對象(它還能創建一個對象的實例來填充)
換句話說,假設HelloModel有一個Name屬性,那麼模型綁定就會在請求中查找名為Name的參數。註意我說的是在“請求中”,而不是“表單集 合”中。模型綁定會在請求中的各個方面進行值查找,這裡麵包括路由數據,查詢字元串,表單集合。有必要的話你還可以添加自定義的值提供信息。
 模型綁定不並局限於Http Post及複雜參數(如HelloModel),你完全可以傳入一個原始的簡單參數:

    public ActionResult HelloModelTest( string name,string text)  
      
       // ….  

在該場景中,模型綁定將會在請求中查找名為name,text 的參數。

顯式模型綁定

當Action有參數的時候,會隱式地執行模型綁定。你還可以在控制器裡面使用UpdateModel和 TryUpdateModel來顯式調用模型綁定。調用UpdateModel的時候,如果模型對象是無效的或者綁定期間發生錯誤則會拋出異常。 TryUpdateModel則不會拋出異常,它返回一個布爾值:如果綁定成功並且模型驗證通過則返回true,否則返回false。

    [HttpPost]  
    public ActionResult HelloModelTest( )  
    {  
        HelloModel model = new HelloModel();  
                  
        if (this.TryUpdateModel(model))  
        {  
            //綁定成功  
        }  
        else  
        {  
        //綁定失敗  
        }  
    }  

模型狀態是模型綁定產生的副產物。每次綁定器綁定值到模型時,都會在模型狀態中進行記錄。你可以在模型綁定之後查看模型狀態來判斷綁定是否成功:

    [HttpPost]  
    public ActionResult HelloModelTest( )  
    {  
        HelloModel model = new HelloModel();  
        this.TryUpdateModel(model);  
        if (ModelState.IsValid)  
        {  
            //綁定成功  
        }  
        else  
        {  
    <pre code_snippet_id="569649" snippet_file_name="blog_20150102_21_3590846" name="code" class="csharp"><span style="white-space:pre">    </span>//綁定失敗  
     }
  }

如果在模型綁定過程中發生異常,模型狀態裡面就會包含導致異常的那個屬性名,綁定值以及錯誤信息。

 


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

-Advertisement-
Play Games
更多相關文章
  • 題目:Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.You should preserve th...
  • 一級指針與二級指針的概念和用法
  • 文章目的對於跨平臺編譯,網上有很多教程和解釋,但零零碎碎總感覺不完整,所以想集中整理一下。但跨平臺編譯是一個很寬泛的問題,如果要全部說清楚,涉及到的問題會有很多,多番查證文獻也會拖慢進度,所以決定隱藏不必要的技術細節,從“不求甚解”的角度,解釋一下跨平臺遇到的各種問題。預計隱藏的部分1.舉例子。比如...
  • 1 static void Ckeditor()2 {3 string tags = @"1234";4 //正則表達式的引擎是貪婪,只要模式允許,它將匹配儘可能多的字元。5 //如何匹配滿足條件的最短字元? 通...
  • 經過前面一段時間的努力,終於把我所知道的關於solr的內容都總結完了。前面講到了solr的安裝配置,web管理後臺的使用,solr的查詢參數和查詢語法,還說到了solr的客戶端solrnet的基本用法和Query,Facet,高亮等實際開發中的常用方法。可以說solr的相關的基礎的內容,都已經講.....
  • 封裝、繼承、多態並不是針對C#語言提出來的,他是一個在面向對象思想下產生的一個概念。所以想要弄明白封裝、繼承、多態,首先就要先瞭解面向對象概念。封裝:當我們提及面向對象的時候,這個對象怎麼來?就是通過我們人為的封裝得來。封裝就是把一些特征或功能組合到一個抽象的對象上。就比如說電腦:它的特征是有一個顯...
  • 現在有一個webform 網站 winform辦公系統,本來是相互獨立的,用的都是三層架構,dal,bll,ibll,model等等都一樣,現在想把wenform項目嵌套到winform中,就是共用dal,bll,ibll,model這些層,然而現在報錯,各種錯,例如:錯誤 157 未能找到元數據....
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...