校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > ASP.NET MVC數組模型綁定詳解

ASP.NET MVC數組模型綁定詳解

熱門標簽:地圖定位圖標標注 地圖標注的公司有哪些 遂寧市地圖標注app 代理接電話機器人如何取消 地圖標注專業團隊 400電話辦理哪家性價比高 天心智能電銷機器人 濮陽外呼電銷系統怎么樣 塔城代理外呼系統

在ASP.NET MVC中使用Razor語法可以在視圖中方便地展示數組,如果要進行數組模型綁定,會遇到索引斷裂問題,如下示例:

input type="text" name="[0].Name" />

input type="text" name="[1].Name" />

input type="text" name="[2].Name" />

input type="text" name="[4].Name" />

input type="text" name="[5].Name" />

數組Name在索引3處斷裂,在模型綁定器解析完成后,會丟棄后面的4和5,只有0、1、2會被正確解析到對應模型中。

這種斷裂在進行動態數組綁定時會經常發生。

下面,以一個案例來探討如何進行動態數組綁定。假設有以下應用場景:

要求能夠動態地添加和刪除乘機人,最終提交表單后乘機人信息要填充到視圖模型中的一個數組或集合屬性中,以方便我們進行后續業務處理。

方式一:使用占位符替換
第一種方式我稱之為”占位符替換“,使用的是ASP.NET MVC默認的模型綁定器(DefaultModelBinder)并結合前端處理。

首先,第一步,根據業務場景設計視圖模型:

public class OrderModel
{
 /// summary>
 /// 航班號
 /// /summary>
 public string FlightNo { get; set; }
 /// summary>
 /// 乘機人
 /// /summary>
 public ListPassenger> Passengers { get; set; }
}
 
public class Passenger
{
 public string Name { get; set; }
 public string IdNo { get; set; }
}

其次,將此視圖模型傳遞給視圖:

public ActionResult New()
{
 Models.OrderModel orderModel = new Models.OrderModel();
 ListModels.Passenger> passenger = new ListModels.Passenger>();
 passenger.Add(new Models.Passenger());
 orderModel.Passengers = passenger;
 return View(orderModel);
}

再在視圖文件中進行展示:

div style="width:680px">
 div class="form-group">
 label>航班/label>br/>
 @Html.TextBoxFor(p => p.FlightNo, new { placeholder = "航班號" })
 /div>
 div class="form-group">
 label>乘機人/label>
 table class="passenger" >
  tbody>
  @if (Model.Passengers != null  Model.Passengers.Count > 0) {
   for(int i = 0; i  Model.Passengers.Count; i++) {
   tr>
    td>姓名:/td>
    td>@Html.TextBoxFor(p => Model.Passengers[i].Name)/td>
    td>身份證號:/td>
    td>@Html.TextBoxFor(p => Model.Passengers[i].IdNo)/td>
    td>
    a href="javascript:;" onclick="removePassenger(this)" >刪除/a>
    /td>
   /tr>
   }
  }
  /tbody>
 /table>
 div style="margin-top:10px">
  a href="javascript:;" onclick="addPassenger()">添加乘機人/a>
 /div>
 /div>
/div>

由于ASP.NET MVC的模型綁定器(DefaultModelBinder)具備自動解析形如"[0].屬性名"、"[1].屬性名"的能力,所以可以在模板文件中以占位符的形式來表示數組下標:

!-- 乘機人模板 -->
script type="text/html" id="passengerTemplate">
 tr>
 td>姓名:/td>
 td>input id="Passengers_{}__Name" name="Passengers[{}].Name" type="text" value="">/td>
 td>身份證號:/td>
 td>input id="Passengers_{}__IdNo" name="Passengers[{}].IdNo" type="text" value="">/td>
 td>
  a href="javascript:;" onclick="removePassenger(this)">刪除/a>
 /td>
 /tr>
/script>

以上代碼中的"{}"是數組下標占位符。當添加乘機人時,可預先計算已有乘機人個數,然后再使用JavaScript替換”{}“為數組下標。

// 添加乘機人
function addPassenger() {
 // 當前添加行數組元素下標
 var index = $(".passenger").find("tbody").find("tr").length;
 //{}是數組元素下標占位符
 var passengerHTML = $('#passengerTemplate').html().replace(/{}/g, index);
 $(".passenger").find("tbody").append(passengerHTML);
}

當刪除乘機人時,注意如果刪除的不是最后一個,會發生索引斷裂問題,需要重新調整數組下標:

// 刪除乘機人
function removePassenger(e) {
 $(e).parents("tr").remove();
 // 依次遍歷表格的每行,重新調整數組下標
 var tb = $(".passenger").first();
 var count = tb.find("tbody").find("tr").length;
 for (var i = 0; i  count; i++) {
 var newTR = tb.find("tr").eq(i).formhtml().replace(/\[\d+\]/g, '[' + i + ']');//重新調整數組元素下標
 tb.find("tr").eq(i).html(newTR);
 }
}

這樣,當我們提交表單時,乘機人信息就會自動填充到模型的Passengers屬性中。

方式二:使用Vue.js
使用第一種方式需要編寫大量前端代碼,包括模板文件,添加刪除事件,還需要處理重新調整順序時的插值問題。

如果使用前端MVVM框架會讓這一流程變得簡單,目前比較流行的前端MVVM框架有AngularJS,有老古董KnockoutJS,也有新興小眾框架Vue.js。

AngularJS比較龐大,這么簡單的一個模型綁定用Anuglar有一種殺雞用牛刀的感覺;Knockout和Vue都是輕量級的MVVM框架,但Knockout需要包裹原生數據來制造可觀察對象,取值和賦值時需要采用函數調用的形式,使用起來不是很方便,所以我選擇了Vue.js。Vue.js是一個輕量高效的庫,它沒有像Angular的module、controller、scope、factory、service這種API,核心就是一個模型綁定功能。大小只有70kb,gzip壓縮后只有25kb,非常輕量化。

這種方式的基本原理是前端使用Vue.js聲明視圖模型并進行綁定,然后提交表單時把模型序列化為json字符串傳遞到后臺,后臺再使用Json.net反序列化為C#對象。

由于Vue.js的綁定特點,我們只需要操作數組元素即可,不需要額外關注DOM操作,節省了不少工作量。

首先,需要聲明視圖模型,并使用Vue.js進行綁定:

script src="~/Scripts/vue.js">/script>
script type="text/javascript">
 // 視圖模型
 var viewModel = {
  FlightNo: '',
  Passengers: [
  { ElementId: 'passenger_1', Name: '', IdNo: '' }
  ]
 }
 // 模型綁定
 new Vue({
  el: '#app',
  data: viewModel,
  methods: {
  removePassenger: function (elementId) {
   for (var i = 0; i  viewModel.Passengers.length; i++) {
   if (viewModel.Passengers[i].ElementId == elementId) {
    viewModel.Passengers.splice(i, 1);
   }
   }
  },
  addPassenger: function () {
   var tb = document.getElementsByTagName('table')[0];
   var index = tb.rows[tb.rows.length - 1].getElementsByTagName('input')[0].getAttribute("id").split('_')[1];
   viewModel.Passengers.push({ Name: '', IdNo: '', ElementId: 'passenger_' + (index + 1) });
  },
  submitForm: function () {
   var jsonString = JSON.stringify(viewModel);
   document.getElementById("viewModel").value = jsonString;
   return true;
  }
  }
 });
/script>

然后,在視圖中使用Vue.js綁定:

form action="/Order2/NewPost" method="post">
 div id="app" style="width:680px">
 div class="form-group">
  label>航班/label>br />
  input v-model="FlightNo" type="text" placeholder="航班號" />
 /div>
 div class="form-group">
  label>乘機人/label>
  table class="passenger">
  tbody>
   tr v-for="passenger in Passengers">
   td>姓名:/td>
   td>input v-model="passenger.Name" v-bind:id="passenger.ElementId" type="text" />/td>
   td>身份證號:/td>
   td>input v-model="passenger.IdNo" type="text" />/td>
   td>
    a href="javascript:;" v-on:click="removePassenger(passenger.ElementId)">刪除/a>
   /td>
   /tr>
  /tbody>
  /table>
  div style="margin-top:10px">
  a href="javascript:;" v-on:click="addPassenger">添加乘機人/a>
  /div>
  div style="margin-top:10px">
  input type="submit" class="btn btn-default" v-on:click="submitForm" />
  /div>
 /div>
 /div>
 input type="hidden" id="viewModel" name="viewModel" />
/form>

最后在Controller里,我們反序列化即可得到對應的C#強類型模型:

[HttpPost]
public ActionResult NewPost()
{
 var jsonString = Request.Form["viewModel"];
 Models.OrderModel model = Newtonsoft.Json.JsonConvert.DeserializeObjectModels.OrderModel>(jsonString);
 if (model != null) {
 // our code here...
 }
 return RedirectToAction("Index", "Home");
}
 

這兩種方式均可以實現動態數組綁定,方式一使用js進行占位符替換,表單中的元素都以[index].屬性名的方式命名,然后由MVC默認的模型綁定器來轉化模型;

方式二使用Vue.js來直接進行模型綁定,提交表單時將模型序列化為json字符串,然后后端再反序列化,最終得到強類型模型。

以上就是本文的全部內容,希望對大家的學習有所幫助。

您可能感興趣的文章:
  • asp.net 字符串、二進制、編碼數組轉換函數
  • asp.net 判斷數組是否存在某個值的方法
  • asp.net(c#) 使用Rex正則來生成字符串數組的代碼
  • asp.net通過js實現Cookie創建以及清除Cookie數組的代碼
  • asp.net 數組中字符串替換的幾種方式
  • vb.net 數組參與SQL語句的查詢范例
  • ASP.NET數組刪除重復值實現代碼
  • .NET數組使用中的注意事項小結
  • .NET下模擬數組越界的方法詳解

標簽:重慶 本溪 吉林 婁底 宜春 麗江 汕頭 河南

巨人網絡通訊聲明:本文標題《ASP.NET MVC數組模型綁定詳解》,本文關鍵詞  ASP.NET,MVC,數組,模型,綁定,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《ASP.NET MVC數組模型綁定詳解》相關的同類信息!
  • 本頁收集關于ASP.NET MVC數組模型綁定詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲一二三四在线| voyeur盗摄精品| 日韩精品在线网站| 伦理电影国产精品| 精品91自产拍在线观看一区| 麻豆久久一区二区| 亚洲精品一区二区三区蜜桃下载 | 日本欧美加勒比视频| 欧美片网站yy| 久久国产尿小便嘘嘘尿| 国产日产欧美一区二区视频| 不卡视频一二三| 亚洲国产成人av网| 欧美日本在线看| 国产精品亚洲专一区二区三区 | 中文字幕色av一区二区三区| 色综合色狠狠综合色| 亚洲成人午夜电影| 久久久久久电影| 91捆绑美女网站| 蜜桃精品在线观看| 国产精品久久久久久久蜜臀| 欧美三级日韩三级国产三级| 激情久久五月天| 一区精品在线播放| 91精品国产综合久久精品app| 黄色日韩网站视频| 亚洲一区二区在线视频| 欧美成人一区二区三区片免费| 成人国产精品免费观看| 午夜精品久久久久影视| 欧美精品一区二区久久婷婷| 色八戒一区二区三区| 韩国av一区二区三区在线观看| 亚洲精品成人在线| 久久综合九色综合97婷婷女人| 一本久道久久综合中文字幕| 六月丁香综合在线视频| 亚洲综合自拍偷拍| 久久久久久久久久久久久久久99 | 亚洲午夜激情网页| 久久久国产精华| 欧美日韩中文精品| 成人午夜视频免费看| 日本特黄久久久高潮| 自拍av一区二区三区| 欧美mv日韩mv国产网站app| 色婷婷久久久亚洲一区二区三区 | 蜜臀久久久99精品久久久久久| 中文字幕欧美激情| 欧美一区二区视频在线观看2020 | 欧美日韩精品欧美日韩精品一综合| 国产在线精品一区二区三区不卡| 一区二区三区中文在线观看| 国产欧美综合在线观看第十页| 91精品国产综合久久久久久| 色综合久久66| caoporn国产精品| 风间由美性色一区二区三区| 免费成人在线网站| 婷婷国产在线综合| 亚洲第一主播视频| 亚洲成人激情自拍| 一区二区三区免费| 一区二区三区在线免费观看| 国产精品久久久久影院老司| 国产人成亚洲第一网站在线播放 | 精品久久久久一区二区国产| 制服丝袜在线91| 欧美日韩精品久久久| 欧美亚洲一区二区三区四区| 91亚洲精品一区二区乱码| 岛国精品一区二区| 国产成人综合网| 国产乱码精品一品二品| 国产一区二区三区观看| 精品制服美女久久| 久久丁香综合五月国产三级网站| 美女视频一区二区| 亚欧色一区w666天堂| 亚洲曰韩产成在线| 婷婷开心久久网| 裸体一区二区三区| 精品一区二区在线观看| 国产久卡久卡久卡久卡视频精品| 国产一区二区三区久久悠悠色av| 激情综合网激情| 成人看片黄a免费看在线| av欧美精品.com| 在线看一区二区| 欧美精品三级日韩久久| 日韩一区二区视频| 国产午夜久久久久| 亚洲精品免费电影| 午夜伦理一区二区| 韩国成人在线视频| 福利一区在线观看| 色美美综合视频| 欧美精品99久久久**| 欧美刺激脚交jootjob| 国产亚洲婷婷免费| 亚洲伦理在线免费看| 日韩福利电影在线观看| 国产一区不卡在线| 99久久精品免费观看| 欧美日韩一区二区三区高清| 亚洲精品一线二线三线无人区| 国产亲近乱来精品视频| 亚洲精品视频观看| 麻豆精品新av中文字幕| 不卡在线视频中文字幕| 欧美丰满嫩嫩电影| 国产精品日产欧美久久久久| 亚洲一区二区三区激情| 精品在线一区二区| 欧美在线free| 26uuu国产在线精品一区二区| 亚洲视频一二区| 美女任你摸久久| 91在线观看美女| 欧美www视频| 男女性色大片免费观看一区二区 | 99综合电影在线视频| 欧美日韩另类一区| 久久久www免费人成精品| 亚洲一区二区精品3399| 国产+成+人+亚洲欧洲自线| 欧美日韩国产123区| 国产精品久久三区| 美国毛片一区二区三区| 色综合久久88色综合天天| www久久精品| 国产精品一区二区视频| 欧美日韩精品一区二区在线播放| 久久精品人人爽人人爽| 亚洲成av人片在www色猫咪| 国产精品亚洲一区二区三区妖精 | 日韩午夜三级在线| 一区二区三区欧美视频| 国产91对白在线观看九色| 欧美一级片在线| 国产精品久久免费看| 国模一区二区三区白浆| 欧美日韩一级片在线观看| 亚洲欧美日韩国产成人精品影院 | 国产精品狼人久久影院观看方式| 美女国产一区二区三区| 欧美亚洲动漫另类| 国产精品伦一区| 精品在线免费视频| 制服.丝袜.亚洲.另类.中文| 亚洲午夜精品在线| 欧美在线你懂的| 一区二区激情视频| 色综合天天综合色综合av| 国产日韩三级在线| 国产ts人妖一区二区| 久久综合成人精品亚洲另类欧美| 免费成人在线播放| 91精品国产91综合久久蜜臀| 午夜精品久久久久久久99水蜜桃| 日本精品免费观看高清观看| 亚洲视频网在线直播| 99久久精品免费看国产| 自拍偷自拍亚洲精品播放| 99热在这里有精品免费| 中文子幕无线码一区tr| 成人毛片视频在线观看| 国产精品久久久久aaaa| 99久久久无码国产精品| 中文字幕一区二| 成人国产精品免费网站| 综合激情成人伊人| 色婷婷综合久久久久中文 | 欧美一二三四区在线| 美女诱惑一区二区| 欧美刺激脚交jootjob| 国产乱淫av一区二区三区| 久久精品欧美一区二区三区麻豆| 大胆欧美人体老妇| 中文字幕一区二区三区四区 | 色综合天天天天做夜夜夜夜做| 中文字幕亚洲一区二区va在线| caoporen国产精品视频| 亚洲精品ww久久久久久p站| 欧美亚洲禁片免费| 美国毛片一区二区三区| 国产欧美精品在线观看| 日本黄色一区二区| 五月婷婷色综合| 久久久久国产精品免费免费搜索| 成人综合在线观看| 成人欧美一区二区三区| 欧美精品aⅴ在线视频| 国产毛片一区二区| 亚洲精品高清在线| 日韩欧美在线网站| 99精品国产热久久91蜜凸| 亚洲综合色噜噜狠狠| 337p日本欧洲亚洲大胆精品|