ASP.NET MVC Action向視圖傳值之匿名類型

来源:https://www.cnblogs.com/xyh9039/archive/2019/08/13/11348684.html
-Advertisement-
Play Games

本章主要和大家分享下在ASP.NET MVC中我們的Action如何向視圖傳遞匿名類型的值。 ...


在使用ASP.NET MVC過程中想必大家都有遇到過一個問題就是我們的Action如何向視圖傳遞匿名類型的值呢,如果不做特殊處理則無法實現。

接下來我們來看一個示例:

在我們的控制中:

using System.Collections.Generic;
using System.Web.Mvc;

namespace TianYa.DotNetShare.MvcDemo.Controllers
{
    public class DemoController : Controller
    {
        // GET: Demo
        public ActionResult Index()
        {
            var listStu = new List<dynamic>
            {
                new
                {
                    SNo="1000",
                    Name = "張三",
                    Sex = "",
                    Age =20
                },
                new
                {
                    SNo="1001",
                    Name = "李四",
                    Sex = "",
                    Age =21
                }
            };
            var stu = new
            {
                SNo = "1002",
                Name = "錢七七",
                Sex = "",
                Age = 20
            };
            ViewBag.stu = stu;
            ViewBag.listStu = listStu;

            return View();
        }
    }
}

在我們的視圖中:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @foreach (var item in ViewBag.listStu)
        {
            <p>學號:@(item.SNo),姓名:@(item.Name),性別:@(item.Sex),年齡:@(item.Age)。</p>
        }

        <p>
            學號:@(ViewBag.stu.SNo),姓名:@(ViewBag.stu.Name),性別:@(ViewBag.stu.Sex),年齡:@(ViewBag.stu.Age)。
        </p>
    </div>
</body>
</html>

然後將網站部署到我們的IIS上面,接下來來訪問一下我們的/demo/index

可以發現報錯了,說明傳值失敗了,那麼接下來我們來簡單介紹下如何解決這個問題。

首先添加一個擴展方法幫助類:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Xml;

namespace TianYa.DotNetShare.CommTool
{
    /// <summary>
    /// 擴展方法
    /// </summary>
    public static class ExtentMethod
    {
        #region 匿名對象處理

        #region 將對象[主要是匿名對象]轉換為dynamic
        /// <summary>
        /// 將對象[主要是匿名對象]轉換為dynamic
        /// </summary>
        public static dynamic ToDynamic(this object value)
        {
            IDictionary<string, object> expando = new ExpandoObject();
            var type = value.GetType();
            var properties = TypeDescriptor.GetProperties(type);
            foreach (PropertyDescriptor property in properties)
            {
                var val = property.GetValue(value);
                if (property.PropertyType.FullName.StartsWith("<>f__AnonymousType"))
                {
                    dynamic dval = val.ToDynamic();
                    expando.Add(property.Name, dval);
                }
                else
                {
                    expando.Add(property.Name, val);
                }
            }
            return expando as ExpandoObject;
        }
        #endregion

        #region 將對象[主要是匿名對象]轉換為List<dynamic>
        /// <summary>
        /// 將對象[主要是匿名對象]轉換為List<dynamic>
        /// </summary>
        public static List<dynamic> ToDynamicList(this IEnumerable<dynamic> values)
        {
            var list = new List<dynamic>();
            if (values != null)
            {
                if (values.Any())
                {
                    list.AddRange(values.Select(v => ((object)v).ToDynamic()));
                }
            }

            return list;
        }
        #endregion

        #region 將匿名對象集合轉換為XML
        /// <summary>
        /// 將匿名對象集合轉換為XML
        /// </summary>
        public static XmlDocument ListObjertToXML(this IEnumerable<dynamic> values)
        {
            var xmlDoc = new XmlDocument();
            var xmlElem = xmlDoc.CreateElement("DocumentElement");
            xmlDoc.AppendChild(xmlElem);
            if (values != null)
            {
                if (values.Any())
                {
                    var node = xmlDoc.SelectSingleNode("DocumentElement");
                    foreach (var item in values)
                    {
                        var xmlRow = xmlDoc.CreateElement("Row");
                        ObjectToXML(item, xmlDoc, xmlRow);
                        node.AppendChild(xmlRow);
                    }
                }
            }

            return xmlDoc;
        }
        #endregion

        #region 將匿名對象填充XML節點
        /// <summary>
        /// 將匿名對象填充XML節點
        /// </summary>
        private static void ObjectToXML(object value, XmlDocument xmlDoc, XmlElement xmlRow)
        {
            IDictionary<string, object> expando = new ExpandoObject();
            var type = value.GetType();
            var properties = TypeDescriptor.GetProperties(type);
            foreach (PropertyDescriptor property in properties)
            {
                var val = property.GetValue(value);
                xmlRow.CloneNode(false);
                var xmlTemp = xmlDoc.CreateElement(property.Name);
                XmlText xmlText;
                if (property.PropertyType.FullName.StartsWith("<>f__AnonymousType"))
                {
                    dynamic dval = val.ToDynamic();
                    xmlText = xmlDoc.CreateTextNode(dval.ObjectToString());
                }
                else
                {
                    xmlText = xmlDoc.CreateTextNode(val.ToString());
                }

                xmlTemp.AppendChild(xmlText);
                xmlRow.AppendChild(xmlTemp);
            }
        }
        #endregion

        #endregion
    }
}

然後對我們的控制器做一些調整,增加調用我們的擴展方法:

using System.Collections.Generic;
using System.Web.Mvc;

using TianYa.DotNetShare.CommTool;

namespace TianYa.DotNetShare.MvcDemo.Controllers
{
    public class DemoController : Controller
    {
        // GET: Demo
        public ActionResult Index()
        {
            var listStu = new List<dynamic>
            {
                new
                {
                    SNo="1000",
                    Name = "張三",
                    Sex = "",
                    Age =20
                },
                new
                {
                    SNo="1001",
                    Name = "李四",
                    Sex = "",
                    Age =21
                }
            };
            var stu = new
            {
                SNo = "1002",
                Name = "錢七七",
                Sex = "",
                Age = 20
            };
            ViewBag.stu = stu.ToDynamic();
            ViewBag.listStu = listStu.ToDynamicList();

            return View();
        }
    }
}

處理完後再來訪問一下我們的/demo/index

可以看出正常顯示了,說明我們的傳值成功了。

至此,本章就介紹完了,如果你覺得這篇文章對你有所幫助請記得點贊哦,謝謝!!!

demo源碼:

鏈接:https://pan.baidu.com/s/1_EXtKKYBYBFpBf5aDT4ASw 
提取碼:atem

 

版權聲明:如有雷同純屬巧合,如有侵權請及時聯繫本人修改,謝謝!!!


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

-Advertisement-
Play Games
更多相關文章
  • Flink Metrics 有如下模塊: <! more "Flink Metrics 源碼解析 —— Flink metrics core" "Flink Metrics 源碼解析 —— Flink metrics datadog" "Flink Metrics 源碼解析 —— Flink met ...
  • JobManager 處理 SubmitJob <! more https://t.zsxq.com/3JQJMzZ 博客 1、 "Flink 從0到1學習 —— Apache Flink 介紹" 2、 "Flink 從0到1學習 —— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程式 ...
  • JobManager 的作用 <! more https://t.zsxq.com/2VRrbuf 博客 1、 "Flink 從0到1學習 —— Apache Flink 介紹" 2、 "Flink 從0到1學習 —— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程式入門" 3、 "F ...
  • 字元串格式化處理 遠古寫法 以前通常使用運算符號 , 插入的值 類型, 指插入的值為包含 3 位小數的浮點數: 關鍵字插入法: Python 3 推薦方法 新版本 Python 中,應選擇使用字元串方法 ,每個替換欄位都用 大括弧(花括弧)括起,括弧內可留空或添加格式設置信息: 一般用法: 索引也可 ...
  • JobGraph <! more https://t.zsxq.com/naaMf6y 博客 1、 "Flink 從0到1學習 —— Apache Flink 介紹" 2、 "Flink 從0到1學習 —— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程式入門" 3、 "Flink 從 ...
  • 在平時看各種框架的源碼的過程中,經常會看到一些位移運算,所以作為一個Java開發者是一定掌握位移運算的。 正數位移運算 Java中有三個位移運算: 我們直接看一下Demo: 乍一眼看到上面Demo的列印結果,你應該是懵逼的,接下來我來解釋一下這個結果到底是如何運算出來的。 上面的Demo中有“2”和 ...
  • 第一種方法: 採用排序,進行兩趟冒泡排序,當數據基本有序(升序)且不要求按照原有數據中的順序輸出時可選擇此方法 第二種方法: 輸出的數據按照原有數據中的順序排列 測試數據: 懶得輸入,就直接初始化了 註意:在第二次使用同一組數據時,需要重新輸入或者定義另一個數組賦初值,切不可直接使用,因為冒泡排序已 ...
  • Win服務程式編寫以及安裝一般步驟 Windows服務的優點有:1. 能夠自動運行。2. 不要求用戶交互。3. 在後臺運行。本文將介紹常見服務程式編寫的一般步驟以及註意事項。 設計服務程式實例: 使用語言:VB.Net,開發工具:Visual Studio 2010 新建服務項目 如圖1所示: 圖1 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...