2

这更容易用一个例子来解释。假设我有一个人类

Public Person
{
string firstName;
string SocialSecurityNumber;
}

当用户在网页中进行一些更改时,Person 对象将被发送回一个接受 Person 作为输入参数的控制器。社会安全号码已加密。我们有许多页面发回将社会安全加密作为参数的对象(不一定是 Person 类)。现在我想修改模型绑定,这样如果发布的对象具有 SocialSecurityNumber 作为属性,它应该会自动解密。我怎样才能做到这一点?

4

2 回答 2

1

您可以使用自定义模型绑定器。一些例子:

这是我之前使用过的一个简单示例,您可以根据需要进行修改:

public class FormatterModelBinder : DefaultModelBinder
{
    internal static string TrimValue([CanBeNull] string value, [CanBeNull] FormatAttribute formatter)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return ((formatter == null) || formatter.Trim) ? value.Trim() : value;
    }

    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
    {
        if ((propertyDescriptor != null) && (propertyDescriptor.PropertyType == typeof(string)))
        {
            var stringValue = value as string;
            var formatter = propertyDescriptor.Attributes.OfType<FormatAttribute>().FirstOrDefault();
            stringValue = TrimValue(stringValue, formatter);
            value = stringValue;
        }

        base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
    }
}

然后,您可以根据需要创建一个属性来装饰该属性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class FormatAttribute : Attribute
{
    public FormatAttribute()
    {
        Trim = true;
    }

    public bool Trim { get; set; }
}

这是由 ViewModel 中属性的属性“激活”的

Public Person
{
    string firstName;
    [Format(Trim = true)]
    string SocialSecurityNumber;
}

修改它以允许加密应该相当简单。

于 2012-11-19T01:23:26.633 回答
1

也许您应该将其存储在自己的类中

public class Person
{
 public string firstName { get; set; }
 public SocialSecurityNumber SSN { get; set; }
}

public class SocialSecurityNumber
{
 public string SSN { get; set; }
}

也许这个类也可以有自己的解密方法。

public class SocialSecurityNumber
{
 public string SSN { get; set; }

 public string Decrypt()
 {
  //TODO: Decrypt SSN
  return decrypted ssn
 }
}

现在在你的控制器中

[HttpPost]
public ActionResult PostedPerson (Person person)
{
 string PersonName = person.firstName;
 string SocialSecurityNumber = person.SSN.SSN;//or person.SSN.Decrypt();
 //TODO: decrypt SocialSecurity number
}

如果您使用 FormCollection 进行模型绑定,则必须设置某种标志或使用抽象来标记该字段已加密

public class Person
{
 public string firstName { get; set; }
 public SocialSecurityNumber SSN { get; set; }
}

public class SocialSecurityNumber
{
 public string SSN { get; set; }
 public string Encrypted { get; set; }//set this to "EncryptedTrue" or something
                                      //similar in order to handle it in the post
}

然后使用您的表单集合

[HttpPost]
public ActionResult PostedPerson (FormCollection fc)
{
 for( var val in fc )
 { 
  if( val is InnerList ){
  {
   if( val.Contains("EncryptedTrue") )
   {
    //then val.SSN would be an encryped social security number
   }
  }
 }
}
于 2012-11-19T01:30:12.200 回答