我知道在 ASP.NET Core 中,可以使用特殊的模型系結屬性([FromRoute]、[FromQuery] 等)自動將某些查詢字串轉換為物件。
是否可以手動執行這樣的轉換?就像是:
var queryString = Request.QueryString;
var obj = SomeMagic.QueryStringToObject<MyClass>(queryString);
uj5u.com熱心網友回復:
您可以使用QueryHelpers.ParseQuery(String)將查詢字串決議為字典。
如果您想要與[FromQuery]屬性提供的實際相同的行為,我會查看該QueryParameterValueSupplier.RenderParametersFromQueryString方法,該方法完成了大部分繁重的作業。我不確定這是否打算在現有 ASP.NET Core 框架基礎結構之外使用。
請注意,查詢字串只是基于字串的名稱-值對的集合。沒有標準規定如何將它映射到更復雜的東西,比如 Java 或 C# 類。因此,像 ASP.NET Core 這樣的框架會在此基礎上構建自己的約定,以使其復雜的系結機制能夠正常作業。(例如foo.bar[2]=123)。ASP.NET Core 實際上有兩種將查詢字串系結到模型的方式(“MVC”方式和“jQuery”方式),請參見JQueryKeyValuePairNormalizer.
// This is a helper method for Model Binding over a JQuery syntax.
// Normalize from JQuery to MVC keys. The model binding infrastructure uses MVC keys.
// x[] --> x
// [] --> ""
// x[12] --> x[12]
// x[field] --> x.field, where field is not a number
private static string NormalizeJQueryToMvc(StringBuilder builder, string key)
最后,就個人而言,我傾向于避免使用比簡單名稱-值對更復雜的查詢字串。當您開始引入更復雜的資料結構時,您也會遇到許多限制。例如:區分null空字串;處理集合的笨拙語法;等等。如果我真的必須使用查詢字串來傳遞復雜的資料結構,我會回退到單個 Base64 編碼的 JSON 字串并在我的代碼中手動處理。
uj5u.com熱心網友回復:
最后,我找到了比決議查詢字串更通用的解決方案。在這里,我獲得了一個 IModelBinder 實體(實際上是 ComplexObjectModelBinder 的一個實體)并將其用作服務。
// DTO
//
public class PersonName
{
public string FirstName { get;set; }
public string LastName { get;set; }
}
// Action handler
// Here I want to convert HTTP request to an instance of PersonName manually
// Example: /SearchByName?LastName=Doe&FirstName=John
//
[AcceptVerbs("GET")]
public async Task<IActionResult> SearchByName(
[FromServices] IModelMetadataProvider modelMetadataProvider,
[FromServices] IModelBinderFactory modelBinderFactory)
{
var valueProvider = await CompositeValueProvider.CreateAsync(ControllerContext);
var modelMetadata = modelMetadataProvider.GetMetadataForType(typeof(PersonName));
var modelBinderFactoryContext = new ModelBinderFactoryContext
{
Metadata = modelMetadata,
CacheToken = modelMetadata
};
var modelBinder = modelBinderFactory.CreateBinder(modelBinderFactoryContext);
var modelBindingContext= DefaultModelBindingContext.CreateBindingContext(ControllerContext, valueProvider, modelMetadata, new BindingInfo(), string.Empty);
await modelBinder.BindModelAsync(modelBindingContext);
var personName = modelBindingContext.Model as PersonName;
// ...
return Ok(personName);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366910.html
下一篇:asp.net中的登錄方法
