zoukankan      html  css  js  c++  java
  • ASP.NET MVC 4.0 学习6-Model Binding

    一,ViewData,ViewBagTempData

    ASP.NET MVC架構中,通過繼承在Controller中的ViewData,ViewBag和TempData和View頁面進行資料的存取,並且適合於少量的資料傳遞。

    1.1  ViewBag

    ViewBag可以產生動態屬性,我們新建項目中看到ViewBag的使用方法:

    Controller中賦值:ViewBag.Title=”首頁”  View中獲取值 @ViewBag.Title

    1.2  ViewData

    Controller中賦值:ViewData[“message”]=”This is ViewData Value”;

    View頁面中取值:@ViewData[“message”]

    1.3  TempData

    和ViewBag,ViewData不同的是,TempData預設把資料存放於Session,

    其生命週期存在於以整個Request的範圍,可以在Controller和Controller之間做資料的傳遞

      public ActionResult Index()
            {
                //ViewData
                ViewData["ViewDataValue"] = "This is ViewData Value";
                //TempData
                TempData["TempDataValue"] = "This is TempData Value";
                //ViewBag
                ViewBag.Message = "修改此範本即可開始著手進行您的 ASP.NET MVC 應用程式。";
    
                return View();
            }
    View Code
     <hgroup class="title">
                    <h1>@ViewBag.Title.</h1>
                    <h2>@ViewBag.Message</h2>
                    <h3>@ViewData["ViewDataValue"]</h3>
                    <h3>@TempData["TempDataValue"]</h3>
                    
     </hgroup>
    View Code

    二,  模型連接(Model Binding)

    ASP.NET MVC中會使用模型連接(Model Binding)使Controller獲取View中的資料。

    2.1簡單的模型連接

    如下示例,View頁面有個id為Content的文本框,對應的Action中有同名的參數Content,這樣當Action被執行的時候程序會通過DefaultModelBinder類別把View頁面傳遞過來的資料傳入Action中的同名參數。

    View:

    @using(Html.BeginForm()){
        <div>@Html.Label("請輸入Content內容: ")<input type="text"/ name="content"></div>
        <div>@Html.Label("您輸入的內容為:")@ViewData["content"]</div>
        <input  type="submit" value="提交"/>
    }

    Action:

            public ActionResult TestAction(string content)
            {
                ViewData["Content"] = content;
                return View();
            }

      

    我們下斷點看一下,點擊提交以後,會通過簡單的數據連接模型把content文本框中的值傳遞到TestAction的參數中,然後通過ViewData["Content"]把值取出。

    2.2 FormCollection

    ASP.NET MVC除了簡單的模型連接取得View頁面資料外,還可以通過FormCollection來取得整個客戶端頁面的資料。

    在Action中加入FormCollection參數以後即可取得表單資料。

    View:

    @{
        ViewBag.Title = "TestAction";
    }
    
    <h2>TestAction</h2>
    
    @using(Html.BeginForm()){
        <div>@Html.Label("請輸入Content內容: ")<input type="text"/ name="content"></div>
        <div>@Html.Label("您輸入的內容為:")@ViewData["content"]</div>
        <input  type="submit" value="提交"/>
    }
    View Code

    Action:

      //FormCollection
            public ActionResult TestAction(FormCollection form)
            {
                ViewData["Content"] = form["content"];
                return View();
            }
    View Code

    2.3複雜模型連接

    1,我們添加TestFormModel類,類中定義三個屬性

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    
    namespace MvcApplication3.Models
    {
        public class TestFormModel
        {
           
            public string Content { get; set; }
           
            public string UserID { get; set; }
    
            public int Age { get; set; }
        }
    }
    View Code

    2,Action參數更改為TestFormModel類別,來接收View頁面傳遞過來的Form表單,

         只要Form表單裏面的欄位名稱和Model類別中的屬性一一對應,即可完成接收動作

    View:

    @{
        ViewBag.Title = "TestForm";
    }
    
    <h2>TestForm</h2>
    @using (Html.BeginForm())
    {
        <div>
            @Html.Label("请输入Content内容:")
            <input name="content" type="text" />
        </div>
        <div>@Html.Label("请输入UserID:")<input name="UserID" type="text" /></div>
       
        <input type="submit" value="提交" />
        <div>
            您提交的内容为:content= @ViewData["Content"]
            <br />
            userID= @ViewData["UserID"]
        </div>
    }
    View Code

    Action,記得添加引用Model

        //複雜模型连接
            public ActionResult TestForm(TestFormModel form)
            {
                ViewData["Content"] = form.Content;
                ViewData["UserID"] = form.UserID;
    
                return View();
            }
    View Code

    3,View頁面輸入的值通過Form表單以Model類的格式傳遞到Controller之後,通過ViewData讀出來

       

    我們下斷點調試可以看到,數據的傳遞:

    2.4 判斷模型驗證結果

    上一個例子我們看到View中的Form表單數據默認和Model類中的屬性一一對應,這樣我們就可以把數據驗證的部分放到Model中進行處理。

    Controller中在處理模型連接的時候,程序會自動處理模型驗證的工作,驗證的結果儲存與ModelState物件中。

    現在我們更新Model中的屬性,前面加[Required]表示這個屬性必須有值的時候ModelState. IsValid==true

    Model:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    
    namespace MvcApplication3.Models
    {
        public class TestFormModel
        {
            [Required]
            public string Content { get; set; }
            [Required]
            public string UserID { get; set; }
            [Required]
            public int Age { get; set; }
        }
    }

    View:

    @{
        ViewBag.Title = "TestForm";
    }
    
    <h2>TestForm</h2>
    @using (Html.BeginForm())
    {
        <div>
            @Html.Label("请输入Content内容:")
            <input name="content" type="text" />
        </div>
        <div>@Html.Label("请输入UserID:")<input name="UserID" type="text" /></div>
       
        <input type="submit" value="提交" />
        <div>
            您提交的内容为:content= @ViewData["Content"]
            <br />
            userID= @ViewData["UserID"]
        </div>
        <div>Model中的數據驗證狀態:@ViewData["Message"]</div>
    }

    Action:當兩個文本框都輸入值的時候,驗證成功 否則失敗

       ////模型验证
            public ActionResult TestForm(TestFormModel form)
            {
                if (ModelState.IsValid)
                {
                    //Model中的数据符合规范
                    ViewData["Message"] = "驗證通過";
                    ViewData["Content"] = form.Content;
                    ViewData["UserID"] = form.UserID;
                }
                else
                {
                    ViewData["Message"] = "驗證失敗";
                }
                return View();
            }
  • 相关阅读:
    树莓派远程监控的实现
    frp内网渗透实现ssh外网访问家里树莓派(树莓派raspbian系统+腾讯云contos7)
    Linux下远程连接断开后如何让程序继续运行
    windows 远程连接登录树莓派桌面
    树莓派设置frpc开机启动
    树莓派 raspbian Linux 系统命令行 快捷键
    MyBatis如何防止SQL注入
    Apache POI导出excel表格
    SpringBoot文件上传
    SpringBoot整合定时任务
  • 原文地址:https://www.cnblogs.com/hishanghai/p/4004285.html
Copyright © 2011-2022 走看看