用于处理解密数据的数据类型 - 作为方法 param 数据类型

本文关键字:数据类型 方法 param 用于 解密 数据 处理 | 更新日期: 2023-09-27 17:56:09

在我们的几个 AJAX 端点上,我们接受一个字符串,并立即在该方法中尝试将字符串解密为 int。 似乎有很多重复的代码。

public void DoSomething(string myId)
{
  int? id = DecryptId(myId);
}

其中 DecryptId 是一种常用方法(在基控制器类中)

我想创建一个为我完成所有这些工作的类,并将这个新类用作方法参数中的数据类型(而不是string),然后是一个返回解密int?getter

最好的方法是什么?

编辑:

这是我正在工作的实现。

public class EncryptedInt
{
    public int? Id { get; set; }
}
public class EncryptedIntModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }
        var rawVal = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var ei = new EncryptedInt
        {
            Id = Crypto.DecryptToInt(rawVal.AttemptedValue)
        };
        return ei;
    }
}
public class EncryptedIntAttribute : CustomModelBinderAttribute
{
    private readonly IModelBinder _binder;
    public EncryptedIntAttribute()
    {
        _binder = new EncryptedIntModelBinder();
    }
    public override IModelBinder GetBinder() { return _binder; }
}

用于处理解密数据的数据类型 - 作为方法 param 数据类型

这是我

正在工作的实现。

public class EncryptedInt
{
    public int? Id { get; set; }
    // User-defined conversion from EncryptedInt to int
    public static implicit operator int(EncryptedInt d)
    {
        return d.Id;
    }
}
public class EncryptedIntModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }
        var rawVal = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var ei = new EncryptedInt
        {
            Id = Crypto.DecryptToInt(rawVal.AttemptedValue)
        };
        return ei;
    }
}
public class EncryptedIntAttribute : CustomModelBinderAttribute
{
    private readonly IModelBinder _binder;
    public EncryptedIntAttribute()
    {
        _binder = new EncryptedIntModelBinder();
    }
    public override IModelBinder GetBinder() { return _binder; }
}

。在 Global.asax 中.cs在 Application_Start 方法中(如果您希望它对所有 EncryptedInt 类型进行全局处理,而不是在每个引用上使用属性)......

// register Model Binder for EncryptedInt type
ModelBinders.Binders.Add(typeof(EncryptedInt), new EncryptedIntModelBinder());