禁止Enum action参数的整数值的最佳方法是什么

时间:2018-03-29 18:24:16

标签: asp.net-mvc asp.net-core

我在某些操作中使用了一些Enum作为参数。例如,我们有以下代码

public enum SomeEnum { SomeVal1 = 1, SomeVal2 = 2 }

[HttpGet]
public void SomeAction(SomeEnum someParameter) { }

默认情况下,asp.net引擎允许使用字符串和整数值,这就是为什么我们可以像“http://host/SomeController/SomeAction/SomeVal1”或“http://host/SomeController/SomeAction/1”或甚至“http://host/SomeController/SomeAction/”一样调用它。{{3 }}的 54 '!我想继续使用字符串值的第一个示例。为此,我实现了以下模型绑定器:

public class RequireStringsAttribute : ModelBinderAttribute
{
    public RequireStringsAttribute() : base(typeof(ModelBinder))
    {

    }

    private class ModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            var value = bindingContext.ValueProvider.GetValue(bindingContext.FieldName).FirstValue;
            var isValid = Enum.GetNames(bindingContext.ModelType).Any(name =>
                name.Equals(value, StringComparison.OrdinalIgnoreCase));
            if (isValid)
            {
                bindingContext.Result = ModelBindingResult.Success(Enum.Parse(bindingContext.ModelType, value, ignoreCase: true));
            }
            else
            {
                bindingContext.ActionContext.ModelState.AddModelError(bindingContext.FieldName, $"The value '{value}' is not valid.");
            }
            return Task.CompletedTask;
        }
    }
}

我已经应用了它:

[HttpGet]
public void SomeAction([RequireStrings]SomeEnum someParameter) { }

它工作正常,但我只是想知道有更好的方法吗?

0 个答案:

没有答案