日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

發(fā)布時(shí)間:2023/12/9 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在QQ群或者一些程序的交流平臺(tái),經(jīng)常會(huì)有人問(wèn):我怎么傳一個(gè)數(shù)組在Action中接收、我傳的數(shù)組為什么Action的model中接收不到、或者我在ajax的data中設(shè)置了一些數(shù)組,為什么后臺(tái)還是接收不了、還有一些怎么傳送一個(gè)復(fù)雜的對(duì)象或者Action怎么接收一個(gè)復(fù)雜的對(duì)象等等這些問(wèn)題。或者有些人遇到復(fù)雜的對(duì)象或者數(shù)組直接就傳送個(gè)json字符串,然后在Action中把json字符串轉(zhuǎn)成model對(duì)象,當(dāng)然這也是一種做法,但也許不是最優(yōu)的做法。

?

一、需求

按照如圖的數(shù)據(jù)格式,傳入到Action,用一個(gè)UserInfo Model接收,需求非常簡(jiǎn)單。

分析后我們可以看到,其中愛(ài)好是個(gè)字符串的數(shù)組,用戶包含一個(gè)公司對(duì)象,然后所包含的公司對(duì)象中又有個(gè)電話數(shù)組,用戶又包含數(shù)組對(duì)象,所以我們的Model應(yīng)該是:

public class UserInfo {public string Name { get; set; }public int Age { get; set; }public string[] Bobbys { get; set; }public Company Company { get; set; }public Star[] Star { get; set; } } public class Company {public string Name { get; set; }public string Address { get; set; }public string[] Tel { get; set; } }public class Star {public string Name { get; set; }public int Age { get; set; }public string Movie { get; set; } }

?

二、表單提交掃盲與驗(yàn)證

我們?cè)谔峤槐韱螘r(shí)不管是post還是get提交,我們所提交的數(shù)據(jù)大部分都是鍵值對(duì)的格式,并不會(huì)直接傳入個(gè)json對(duì)象至后臺(tái),最多也只會(huì)傳入個(gè)字符串的json,這個(gè)也許是受ajax data設(shè)置的誤導(dǎo),很多人都會(huì)認(rèn)為可以直接設(shè)置json對(duì)象提交至后臺(tái),也許格式簡(jiǎn)單的Model可以接收到,但是復(fù)雜一點(diǎn)的,比如其中包含數(shù)組的等,即使json的格式和Model的格式一致,Model并不會(huì)接收到前臺(tái)的提交的數(shù)組數(shù)據(jù),這個(gè)也是我文章剛開(kāi)始所提的一個(gè)問(wèn)題。

為了驗(yàn)證我說(shuō)的ajax提交json格式的數(shù)據(jù),我們做一下驗(yàn)證。

Action:

[HttpPost] public ActionResult Index(UserInfo user) {return Json(user); }

Ajax:

$.ajax({url: "/",type: "post",data: {"name": "Emrys","age": "26","bobbys": ["足球", "電影"],"company": {"name": "上海xxxxxx公司","address": "上海徐匯區(qū)xxxx路","tel": ["021-88888881","021-88888882","021-88888883","021-88888884"]},"star": [{ "name": "成龍", "age": "63", "movie": "十二生肖" },{ "name": "劉亦菲", "age": "18", "movie": "功夫之王" },{ "name": "胡歌", "age": "24", "movie": "瑯琊榜" }]},success: function (r) {console.log(r);} });

?這個(gè)是我們經(jīng)常提交的data數(shù)據(jù)格式,如果我們后臺(tái)的model格式即使和data的數(shù)據(jù)格式一模一樣,也只有name一項(xiàng)可以正常接收到數(shù)據(jù),其他的所有數(shù)據(jù)都將接收不到,至于為什么。我們看一下jquery給我們轉(zhuǎn)成的鍵值對(duì)的格式就應(yīng)該知道了,我們從chrome或者火狐的調(diào)試工具的network中可以看到提交的格式。

其中數(shù)組的格式為:xxxxxx[]的格式,對(duì)象中的對(duì)象格式為xxxx[yyyyy]格式,我沒(méi)有探究為什么是這個(gè)格式,也許是其他的語(yǔ)言需要這樣的格式,php,jsp或者其他的語(yǔ)言吧,但asp.net mvc很明顯不需要這樣的格式。

后面是毀三觀的驗(yàn)證,結(jié)果結(jié)果竟然全都能用Model接收到數(shù)據(jù),接收到了,接收到,接收,接,了,我。。。。。。。。。突然感覺(jué)有一百個(gè)那個(gè)什么飛過(guò)啊。。。。。。。。。。

我一度懷疑自己,難道之前做了幾年mvc的開(kāi)發(fā)的模型綁定理解錯(cuò)了,之前開(kāi)發(fā)用jquery的ajax轉(zhuǎn)成的格式是不能接收到數(shù)據(jù)的啊,那是為什么為什么啊。經(jīng)過(guò)探索測(cè)試發(fā)現(xiàn),我之前也沒(méi)有理解錯(cuò),原來(lái)是版本的問(wèn)題。我測(cè)試是用的mvc5做的測(cè)試,mvc5可能對(duì)jquery ajax轉(zhuǎn)成的格式做了優(yōu)化,但是mvc5之前的版本是不可以的,這個(gè)是重點(diǎn)

那也就是說(shuō),如果你用的mvc5做的開(kāi)發(fā),反而簡(jiǎn)單了很多,可以直接在ajax的data設(shè)置json格式的數(shù)據(jù),復(fù)雜的,數(shù)組都可以,也許微軟開(kāi)發(fā)人員也發(fā)現(xiàn)了這個(gè)問(wèn)題,在mvc5解決了,我并沒(méi)有去研究源碼的區(qū)別,總之呢,mvc5是可以的。那mvc5以前的版本就會(huì)遇到我說(shuō)的那個(gè)問(wèn)題了。 ?

?

三、模型綁定分析

博客模擬的表單已經(jīng)可以包含網(wǎng)站開(kāi)發(fā)過(guò)程中遇到的大部分的表單格式了,包含一些數(shù)組、對(duì)象等等。

從以前的開(kāi)發(fā)的mvc項(xiàng)目中,發(fā)現(xiàn)了一些模型綁定的規(guī)律,區(qū)別在于數(shù)組和對(duì)象中的對(duì)象。

下面的圖片是手動(dòng)轉(zhuǎn)成鍵值對(duì)的值,mvc5之前的版本可以適用的格式,當(dāng)然mvc5也是可以識(shí)別的,或者說(shuō)這個(gè)格式是所有的mvc版本都可以適用的格式。

下圖是兩種格式的對(duì)比圖

?

關(guān)于其中的規(guī)則,自己總結(jié)吧,應(yīng)該很簡(jiǎn)單了。

有人會(huì)問(wèn),手動(dòng)拼的格式應(yīng)該怎么拼呢,這里經(jīng)常用的有兩種格式。

1、直接拼接字符串

$.ajax({url: "/",type: "post",data: "name=Emrys&age=26&bobbys[0]=足球&star[0].movie=瑯琊榜",success: function (r) {console.log(r);} });

?

2、javascript對(duì)象

var data1 = { name: "Emrys" }; data1.age = 26; data1["bobbys[0]"] = "足球"; data1["star[0].movie"] = "瑯琊榜"; $.ajax({url: "/",type: "post",data: data1,success: function (r) {console.log("xxxxxxxxxxxxxx");console.log(r);} });

用戶可以根據(jù)情況選擇不同的拼接方式。

?

四、總結(jié)

順便分享一個(gè)技巧,就是當(dāng)我們拿到一段json的時(shí)候,別急著在類中新建model,一個(gè)一個(gè)類,一個(gè)一個(gè)的屬相敲,vs已經(jīng)提供了一個(gè)很強(qiáng)大的工具,知道的可以忽略本段。

?

源碼地址Github:https://github.com/Emrys5/Asp.MVC-04-ModelBinding

以上就是關(guān)于模型綁定的一些應(yīng)用,本文原創(chuàng),歡迎拍磚和推薦。 ??

系列課程

  • [asp.net mvc 奇淫巧技] 01 - 封裝上下文 - 在View中獲取自定義的上下文
  • [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action內(nèi)生成Html代碼
  • [asp.net mvc 奇淫巧技] 03 - 枚舉特性擴(kuò)展解決枚舉命名問(wèn)題和支持HtmlHelper
  • [asp.net mvc 奇淫巧技] 04 - 你真的會(huì)用Action的模型綁定嗎?
  • [asp.net mvc 奇淫巧技] 05 - 擴(kuò)展ScriptBundle,支持混淆加密javascript
  • [asp.net mvc 奇淫巧技] 06 - 也許你的項(xiàng)目同一個(gè)用戶的請(qǐng)求都是同步的

轉(zhuǎn)載于:https://www.cnblogs.com/emrys5/p/asp-net-mvc-04-modelbinding.html

總結(jié)

以上是生活随笔為你收集整理的[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。