2012-11-19 176 views
2

這個例子更容易解釋。假設我有一個Person類在MVC中操作模型綁定4

Public Person 
{ 
string firstName; 
string SocialSecurityNumber; 
} 

當有些變化是由在網頁中用戶提出,Person對象回發到接受個人作爲輸入參數的控制器。 SocialSecurity號碼已加密。我們有許多頁面發佈加密社會安全作爲參數的對象(不是必需的Person類)。現在我想修改模型綁定,這樣如果發佈的對象具有SocialSecurityNumber作爲屬性,它應該被自動解密。我怎樣才能做到這一點?

回答

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; } 
} 

這是在視圖模型

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

它應該是相當簡單的修改是爲了讓加密「激活」通過對財產的屬性。

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 
    } 
    } 
} 
}