2017-03-09 5 views
1

エンティティフレームワークを使用するASP.NET MVC Webアプリケーションを構築しています。ユーザー入力はデータベースに格納され、後でその一部が表示されます。クロスサイトスクリプティングを防ぐため、挿入前にAntiXssEncoder.HTMLEncode()を使用してデータベースに保存されたすべてのユーザー入力データを実行します。私は関数を使ってすべてのフィールドを手動で実行できることを知っています。しかし、私はより効率的な方法があるかどうか疑問に思っています。たとえば、データを保存する前にこのロジックを追加するようにDBConextクラスを変更します。今、私はこのようなものを持っています:エンティティフレームワーク - 何らかの方法で挿入する前にAntiXssEncoder.HTMLEncode()を挿入します。

 [HttpPost] 
    public ActionResult ModuleOne(ModuleOneData formData) 
    { 

     ModuleOneViewModel vm = new ModuleOneViewModel(); 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value); 
     Int32 newHireID = Convert.ToInt32(ticket.Name); 
     Employee newHire = dbContext.Employees.FirstOrDefault(e => e.EmployeeID == newHireID); 
     String sigFileName = ""; 
     // Pay Selection 

     newHire.PaySelection = AntiXssEncoder.HtmlEncode(formData.PaySelection, false); 
     newHire.PaySelectionDate = formData.PaySelectionDate; 
     newHire.PaySelectionSignature = formData.PaySelectionDate; 

など、もっと多くのフィールドがあります。 また、着信POSTデータをループしてこの機能を適用する方法はありますか?参考までに、ModuleOneDataは次のようになります。

public class ModuleOneData 
{ 
    public int EmployeeID { get; set; } 

    public String PaySelection { get; set; } 
    public String PaySelectionSignature { get; set; } 
    public String PaySelectionDate { get; set; } 
    public String PaySelectionAccountType { get; set; } 
    public String PaySelectionAccountNumber { get; set; } 
    public String PaySelectionRoutingNumber { get; set; } 
    public HttpPostedFileBase PaySelectionCheck { get; set; } 
    public String DirectDepositInitials { get; set; } 
    public String MoneyNetworkInitials { get; set; } 

    public String WorkCompSignature { get; set; } 
    public String WorkCompSignatureDate { get; set; } 

    public String JobDescriptionSignature { get; set; } 
    public String JobDescriptionSignatureDate { get; set; } 

    public String MemoSignature { get; set; } 
    public String MemoSignatureDate { get; set; } 

    public String CriminalCheckSignature { get; set; } 
    public String CriminalCheckDate { get; set; } 

    public String AgeAcknowledgmentSig { get; set; } 
    public String AgeAcknowledgmentSigDate { get; set; } 

    public String DocumentReceiptSignature { get; set; } 
    public String DocumentReceiptDate { get; set; } 

    public String HandbookSignature { get; set; } 
    public String HandbookSignatureDate { get; set; } 

    public String DatingPolicySignature { get; set; } 
    public String DatingPolicyDate { get; set; } 

    public String UniformReceiptSignature { get; set; } 
    public String UniformReceiptDate { get; set; } 


    public string ageSigData { get; set; } 
    public string paySigData { get; set; } 
    public string workCompSigData { get; set; } 
    public string jobSigData { get; set; } 
    public string documentSigData { get; set; } 
    public string handbookSigData { get; set; } 
    public string uniformSigData { get; set; } 
    public string criminalSigData { get; set; } 
    public string harassmentSigData { get; set; } 
    public string datingSigData { get; set; } 

} 

ありがとうございます。

答えて

1

いいえ、最も効率的な方法は、すべての単一フィールドを手動でマッピングすることです。しかし、これは最大の手動介入です。

ビジネス・ロジック/検証とデータ永続性を結合しているので、この操作を実行するためにdbcontextを変更する必要はありません。

あなたは常にすべての公共の文字列プロパティをループするためにリフレクションを使用し、各値にHtmlEncodeを呼び出すことができますパフォーマンスヒットのビットを取って喜んでいる場合:

var formData = new ModuleOneData(); 
    formData.PaySelection = "test1"; 
    formData.PaySelectionSignature = "test2"; 

    formData 
     .GetType() 
     .GetProperties().Where(x => x.GetType() == typeof(string)).ToList() 
     .ForEach(x => 
      x.SetValue(formData, AntiXssEncoder.HtmlEncode(
       (string)x.GetValue(formData), false))); 
0

あなたは出力にエンコードする必要があります(ときあなたは表示します)、保存するときではありません。

関連する問題