[英]Sanitising parameters in ASP.Net Core 2.2
我有一個看似相當具體的問題。 我的頂級控制器和復雜參數模型是自動生成的(Nswag)。 一些模型由枚舉組成。 我有必須包含反斜杠的參數(在查詢或正文中)。 自動生成的枚舉中的這些值會自動將反斜杠替換為下划線。 為了使模型驗證有效,我必須以某種方式捕獲與這些枚舉綁定的參數,並在綁定發生之前更改它們。
例如,給定一個查詢
?param=A\\B
(或帶有param="a\\b"
的主體)和枚舉:
public enum SomeEnum
{
[System.Runtime.Serialization.EnumMember(Value = @"A\B")]
A_B = 0
}
模型驗證失敗,因為自然會在枚舉中找不到A\\B
我嘗試過過濾器,自定義模型綁定器等,自定義模型綁定似乎是最好的地方,因為它可以精確地應用於綁定該特定模型的位置。 現在,問題是我需要修改傳入的參數,並使用下划線綁定到修改后的版本。 我一輩子都找不到解決方法。 我實現了一個自定義IModelBinder類,該類可以正確調用,但ModelBindingResult.Success(model)
不會更改綁定到的對象 。
只需清楚一點,這與URL編碼或綁定到集合等無關。這一切都很好。
我本質上需要修改與特定Enum綁定的參數,以使其與自動生成的枚舉屬性匹配。 任何想法表示贊賞。
似乎,自定義活頁夾是正確進行編碼的正確方法。下面是活頁夾類,可以很好地工作。 SSASPropertyNameBinder
是其值可以包含反斜杠的枚舉。 此類主要來自於MS ASP.Net Core文檔中有關自定義模型粘合劑的樣板-有趣的是最后。
public class SSASPropertyNameBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var modelName = bindingContext.ModelName;
// Try to fetch the value of the argument by name
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
var value = valueProviderResult.FirstValue;
// Check if the argument value is null or empty
if (string.IsNullOrEmpty(value))
{
return Task.CompletedTask;
}
ValueProviderResult newValueProviderResult = new ValueProviderResult(valueProviderResult.FirstValue.Replace(@"\", "_"));
bindingContext.ModelState.SetModelValue(modelName, newValueProviderResult);
SSASServerPropertyName spn;
// Check if a valid SSAS property
if (Enum.TryParse<SSASServerPropertyName>(newValueProviderResult.FirstValue, out spn))
{
bindingContext.Result = ModelBindingResult.Success(spn);
}
else
{
bindingContext.ModelState.TryAddModelError(modelName, $"Invalid SSAS Property: {valueProviderResult.FirstValue}");
}
return Task.CompletedTask;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.