1 句代碼,搞定 ASP.NET Core 綁定多個源到同一個類

問題

有群友希望將路由中的信息綁定到一個Dto對象中:

public?class?DDDDDto
{[FromRoute(Name?="collectionId")]public?Guid?collectionId?{?get;?set;?}[BindProperty(Name?=?"relativeUrl")]public?string?relativeUrl?{?get;?set;?}
}

這樣就不用在 Action 中定義一堆參數了:

[HttpGet("collections/{collectionId}/patn/{relativeUrl}/children",?Name?=?"QueryChildrenOfItem")]
public?async?Task<DDDDDto>?QueryChildren([FromRoute(Name?=?"collectionId")]?Guid?collectionId,[FromRoute(Name?=?"relativeUrl")]?string?relativeUrl)

想法很好,對吧!

但是實際運行,卻發現達不到想要的效果,沒有綁定到數據:

1a71a041cbed332279945bd6a8219f67.jpeg

這說明 ASP.NET Core 默認是無法將其他不同的源綁定到單個類的。

那能不能換種方式,解決這個問題呢?

源碼探究

首先,我們查看源碼,想看看FromRouteAttribute是如何工作的。

僅在InferParameterBindingInfoConvention類中找到一處調用:

var?message?=?Resources.FormatApiController_MultipleBodyParametersFound(action.DisplayName,nameof(FromQueryAttribute),nameof(FromRouteAttribute),nameof(FromBodyAttribute));message?+=?Environment.NewLine?+?parameters;
throw?new?InvalidOperationException(message);

結果,這段代碼還是用來生成異常信息的!?

不過,這段代碼前面的部分引起了我們的注意:

9fd3a40e8ca3e2e0b33cc5805fcfb778.jpeg

這明顯是在設置綁定源信息:

bindingSource?=?InferBindingSourceForParameter(parameter);parameter.BindingInfo?=?parameter.BindingInfo????new?BindingInfo();
parameter.BindingInfo.BindingSource?=?bindingSource;

InferBindingSourceForParameter的實現代碼如下:

internal?BindingSource?InferBindingSourceForParameter(ParameterModel?parameter)
{if?(IsComplexTypeParameter(parameter)){if?(_serviceProviderIsService?.IsService(parameter.ParameterType)?is?true){return?BindingSource.Services;}return?BindingSource.Body;}if?(ParameterExistsInAnyRoute(parameter.Action,?parameter.ParameterName)){return?BindingSource.Path;}return?BindingSource.Query;
}

單個類肯定是IsComplexTypeParameter, 這將讓方法返回BindingSource.Body

這也正好解釋了: 正常情況下,如果使用單個類作為 Action 參數,默認從 Body 源綁定的原因。

那么,能否改變 ASP.NET Core 這一默認的綁定行為嗎?

柳暗花明

繼續查看InferParameterBindingInfoConvention的使用,我們發現它的調用,居然在一個條件分支內:

if?(!options.SuppressInferBindingSourcesForParameters)
{var?serviceProviderIsService?=?serviceProvider.GetService<IServiceProviderIsService>();var?convention?=?options.DisableImplicitFromServicesParameters?||?serviceProviderIsService?is?null??new?InferParameterBindingInfoConvention(modelMetadataProvider)?:new?InferParameterBindingInfoConvention(modelMetadataProvider,?serviceProviderIsService);ActionModelConventions.Add(convention);
}

那么,如果讓SuppressInferBindingSourcesForParameters設為true,會有什么效果呢?

builder.Services.Configure<ApiBehaviorOptions>(options?=>
{options.SuppressInferBindingSourcesForParameters?=?true;
});

下面,就是見證奇跡的時刻:

bea6d77b6b97bc8f2fd8849d4fef2f79.png

我們也嘗試了從其他源,比如 Query,傳遞數據,都可以正常綁定。

1 句代碼,我們搞定了 ASP.NET Core 將多個來源綁定到同一個類的功能。

結論

后來,我們在官方文檔(https://docs.microsoft.com/zh-cn/aspnet/core/web-api/?view=aspnetcore-6.0)找到了解釋:

9ee1ab5e2ca5408f53ecd82db8955eb0.png

當沒有在參數上顯式指定[FromXXX]時,ASP.NET Core 會進行綁定源推理,比如會推斷單個類的綁定源為 Body。

設置 SuppressInferBindingSourcesForParameter 為 true,則會禁用綁定源推理。ASP.NET Core 運行時會嘗試按順序從所有源中拉取數據進行綁定。

添加微信號【MyIO666】,邀你加入技術交流群

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redux中間件的用法

1.定義 中間件就是一個函數&#xff0c;對store.dispatch方法進行了改造&#xff0c;在發出 Action 和執行 Reducer 這兩步之間&#xff0c;添加了其他功能。 2.舉例 日志中間件 import { applyMiddleware, createStore } from redux; import createLogger from redux-logger; …

設置git自動補全功能(windows版本)

目錄 下載 Git 的源代碼 在目錄中 git/contrib/completion/ 中找到 git-completion.bash 文件 將 git-completion.bash 文件改名為 .git-completion.bash 找到本機git安裝目錄 將.git-completion.bash文件復制到git安裝目錄下的etc文件夾 打開同目錄下的 bash.bashrc 文件&…

用Vue搭建一個應用盒子(二):datetime-picker

接著上次的進度&#xff0c;我們已經實現了一個todo-list。它已經具備了基本的功能&#xff0c;可以新建、編輯、刪除任務。但是美中不足的是&#xff0c;它的時間設定上只能通過輸入一段字符串來設定&#xff0c;很不社會。我們應該完成的效果是一個time-picker&#xff0c;日…

ArcGIS實驗教程——實驗四十八:ArcGIS制圖表達入門及案例教程

文章目錄 1. 制圖表達的概念1.1 什么是地圖表達1.2 使用制圖表達改善要素外觀1.3 制圖表達的優點2. 使用制圖表達2.1 創建制圖表達2.2 使用制圖表達來符號化圖層2.3 使用制圖表達規則3. 地圖表達實戰案例1.創建制圖表達2.添加幾何效果3.使用制圖規則4.使用制圖表達屬性覆蓋1. 制…

PAT (Advanced Level) 1070. Mooncake (25)

簡單貪心。先買性價比高的。 #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std;doub…

[轉]Java 18 還未用上,Java 19 最新兩大特性曝光

鐵打的 Java&#xff0c;流水的版本。 不久前&#xff0c;Java 18 才正式發布&#xff0c;遵循 Oracle 六個月發一版本的頻率&#xff0c;Java 19 將在今年 9 月出爐。這不&#xff0c;還沒等眾多開發者用上 Java 18&#xff0c;關于 Java 19 最新的兩個目標功能就被披露了出…

文本生成器(bzoj 1030)

Description JSOI交給隊員ZYX一個任務&#xff0c;編制一個稱之為“文本生成器”的電腦軟件&#xff1a;該軟件的使用者是一些低幼人群&#xff0c;他們現在使用的是GW文本生成器v6版。該軟件可以隨機生成一些文章―――總是生成一篇長度固定且完全隨機的文章—— 也就是說&…

C# 值類型和引用類型講解

要了解值類型和引用類型&#xff0c;我們首先要知道堆和棧的區別&#xff1a;① 棧是編譯期間就分配好的內存空間&#xff0c;因此你的代碼中必須就棧的大小有明確的定義&#xff1b;堆是程序運行期間動態分配的內存空間&#xff0c;你可以根據程序的運行情況確定要分配的堆內存…

【ArcGIS微課1000例】0048:制圖表達(3)---水立方效果實現

本文講解ArcGIS中水立方效果的實現過程(制圖表達案例)。 文章目錄 一、效果展示二、制作步驟1. 創建數據庫及要素數據集2. 創建范圍3. 創建隨機點4. 創建泰森多邊形5. 創建制圖表達一、效果展示 基于制圖表達的思想,可以容易實現多種形式的水立方效果,例如: 怎么實現的呢…

Java中this與super的區別

2019獨角獸企業重金招聘Python工程師標準>>> this與super關鍵字在java中構造函數中的應用&#xff1a; ** super()函數 ** super()函數在子類構造函數中調用父類的構造函數時使用&#xff0c;而且必須要在構造函數的第一行&#xff0c;例如&#xff1a; class Ani…

EF選擇Mysql數據源

EF添加ADO.NET實體模型處直接選擇Mysql數據源 最近想到EF是連接多數據庫的orm框架&#xff0c;于是就想測試下。查了一堆網上資料后&#xff0c;測試連接mysql成功。步驟如下&#xff1a; 1、在你項目Model層中nuget安裝MySql.Data.Entity 如果沒安裝這個provider 就進行下面的…

JIRA簡介及基本概念

目錄 第一章 JIRA簡介 1.1 什么是JIRA 1.2 JIRA的主要功能 1.3 JIRA的主要特點 1.3.1 JIRA的優點 1.3.2 JIRA的缺點 1.4 相關版本 第二章 JIRA的基本概念 2.1 JIRA 中涉及的角色 2.1.1 管理人員 2.1.2 項目管理者 2.1.3 開發人員 2.1.4 測試人員 2.2 問題 2.2.1…

CodeChef Chef and Churu [分塊]

題意&#xff1a; 單點修改$a$ 詢問$a$的區間和$f$的區間和 原來普通計算機是這道題改編的吧... 對$f$分塊&#xff0c;預處理$c[i][j]$為塊i中$a_j$出現幾次&#xff0c;$O(NH(N))$&#xff0c;只要每個塊差分加上然后掃一遍就行了不用樹狀數組之類的 修改&#xff0c;整塊直接…

SkiaSharp 之 WPF 自繪 拖曳小球(案例版)

感謝各位大佬和粉絲的厚愛和關心( 催更)&#xff0c;我會再接再厲的&#xff0c;其實這也是督促自己的一種方式&#xff0c;非常感謝。剛寫了一篇萬字長文&#xff0c;自己也休養生息(低調發育)了一段時間&#xff0c;接下來來幾個小案例。拖曳小球WPF的拖曳效果&#xff0c;基…

Nodejs Guides(四)

EVENTS events模塊API實例 const EventEmitter require(events);class MyEmitter extends EventEmitter { } //EventListener 會按照監聽器注冊的順序同步地調用所有監聽器。 //所以需要確保事件的正確排序且避免競爭條件或邏輯錯誤。 //監聽器函數可以使用 setImmediate() 或…

[轉]常用自動化測試工具

1、Appium 官網&#xff1a;http://appium.io AppUI自動化測試 Appium 是一個移動端自動化測試開源工具&#xff0c;支持iOS 和Android 平臺&#xff0c;支持Python、Java 等語言&#xff0c;即同一套Java 或Python 腳本可以同時運行在iOS 和Android平臺&#xff0c;Appium 是…

ABP學習資源整理

不同的編程語言都有構建Web Application的框架&#xff0c;比如C#中的ASP.NET Core和ABP&#xff0c;Java中的Spring Boot和Spring Cloud&#xff0c;Python中的Django和Flask&#xff0c;Node.js中的Express和Koa2&#xff0c;Go中的Beego和Gin等。今天要介紹的主角是ABP框架&…

【ArcGIS微課1000例】0049:制圖表達(4)---自由式制圖表達

文章目錄 一、轉換為自由表達并編輯二、將效果轉換為幾何當編輯地圖時,可能會遇到一個獨特的或顯著的特征,需要專門的符號的情況,可以使用覆蓋的制圖表達來實現,但是往往不夠。可能需要簡單地繪制一個圖形以達到要求的外觀,這時可以嘗試使用自由式制圖表達。 自由式制圖表…

基于FPGA的異步FIFO設計

今天要介紹的異步FIFO&#xff0c;可以有不同的讀寫時鐘&#xff0c;即不同的時鐘域。由于異步FIFO沒有外部地址端口&#xff0c;因此內部采用讀寫指針并順序讀寫&#xff0c;即先寫進FIFO的數據先讀取&#xff08;簡稱先進先出&#xff09;。這里的讀寫指針是異步的&#xff0…

顧小清:教育信息化進入數字化轉型重要時期

身處技術加快更新、新概念頻出的時代&#xff0c;教育信息化的發展更需要堅守以人為本的初心&#xff0c;在熱點炒作的雜音中保持理智&#xff0c;避免盲目&#xff0c;抓住符合教育規律、滿足教育需求、安全有效的準繩&#xff0c;理性推進和落實。 技術在不斷發展&#xff0c…