2012-04-25 4 views
0

にオブジェクトを渡していた場合にどのように私は、私は次のプロパティを持つ訪問という名前のオブジェクトを持って更新されてからいくつかの値を防ぐことができます -私はモデルバインダー

注 DoctorID VisitTypeID CREATEDBY 日 VISITID PatientID StatusID編集で

は、ユーザーが唯一の次の2つのプロパティを編集することができます表示 タイムスタンプ: - 注 DoctorID ので、私は以下のように私の編集ビューに隠されたフィールドなどの他のプロパティを追加しました: -

@using (Html.BeginForm()) { 
     @Html.ValidationSummary(true) 
     <fieldset> 
      <legend>Visit</legend> 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.Note) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.Note) 
       @Html.ValidationMessageFor(model => model.Note) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(model => model.DoctorID) 
      </div> 
      <div class="editor-field"> 
       @Html.DropDownList("DoctorID", String.Empty) 
       @Html.ValidationMessageFor(model => model.DoctorID) 
      </div> 

      <p> 
       @Html.HiddenFor(model => model.VisitTypeID) 
       @Html.HiddenFor(model => model.CreatedBy) 
       @Html.HiddenFor(model => model.Date) 
       @Html.HiddenFor(model => model.VisitID) 
       @Html.HiddenFor(model => model.PatientID) 
       @Html.HiddenFor(model => model.StatusID) 
       @Html.HiddenFor(model => model.timestamp) 

      <input type="submit" value="Create" /> 

を私は私のポスト編集アクションメソッドへの訪問オブジェクトを渡しておりますので、私は私の編集ビュー内のすべてのプロパティが含まhaveto ,,どの以下のようになります -

[HttpPost] 
      public ActionResult Edit(Visit visit) 
      { 
       if (!(visit.Editable(User.Identity.Name))) 
       { 
        return View("NotFound"); 
       } 
       try 
       { 
        if (ModelState.IsValid) 
        { 
         repository.UpdateVisit(visit); 
         repository.Save(); 
         return RedirectToAction("Index"); 
        } 
       } 
       catch (DbUpdateConcurrencyException ex) 
       { 
    var entry = ex.Entries.Single(); 
        var clientValues = (Visit)entry.Entity; 

        ModelState.AddModelError(string.Empty, "The record you attempted to edit " 
        + "was modified by another user after you got the original value. The " 

    //code goes here 

だから私はこれらの理由のために上記のアプローチが心配です: - 1.攻撃者がhiddenfields値を変更することがあります。 2.訪問モデルクラスで[Bind(Include = ".... ....")]を定義できません。

ので、私はこのアプローチを使用し続ける必要があるかどうかを判断することができませんOR

+0

ViewModelを使用する必要があります。 – SLaks

+0

しかし、ViewModleを使用すれば、ViewModelはデータベース内の関連タイムスタンプ値を持たないため、タイムスタンプ値を追跡することができます。私のアクションメソッドと同じように、DbUpdateConcurrencyExceptionをチェックしていますタイムスタンプの値が編集プロセス中に見つかりました... –

+0

返信のためにViewModel – SLaks

答えて

0

あなたが潜在的に、その後2つのフィールドのみを持ち越すあなたのコントローラでVisitオブジェクトを再引っ張る可能性が追随するよりよい方法がありますあなたは移入したいと思う。これにより、2つのフィールドだけが編集されることが保証されます。

Visit existingVisit = /* retrieve Visit */; 
existingVisit.Note = visit.Note; 
existingVisit.DoctorID = visit.DoctorID; 
repostistory.Update(existingVisit); 
reposistory.SaveChanges(); 

しかし、私はイベントをさらに進め、関連するフィールドだけを含む特定のアクションのビューモデルを作成することができます。

+0

apprachを使用して訪問オブジェクトを検索し、値で再プルすると、DbUpdateConcurrencyExceptionは決して発生しませんなぜなら、必要なときにDbUpdateConcurrencyExceptionを発生させるためには、アクションメソッドにオブジェクトを渡す必要があるからです。 –

+0

タイムスタンプベースの重複チェックは使用しませんか?私たちが複数のユーザを変更したときはいつでも、私たちは保存しようとしているオブジェクトと同意するならば、seに保存する際に再チェックされる "最後に更新された"カラムを使用しました(そして、 )。 –

+0

"あなたはタイムスタンプベースの重複チェックを使用しません"とは何を意味するのか分かりませんが、タイムスタンプは編集プロセスのwhere句に含まれ、編集プロセスはDbUpdateConcurrencyExceptionが生成されるオブジェクトを更新しませんでした,,つまり、オブジェクトをretrivinfした後、オブジェクトが別のユーザーによって変更されたことを意味... –

関連する問題