簡體   English   中英

清理ASP.Net Core 2.2中的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM