2012-04-25 4 views
0

나는 다음과 같은 특성을 가진 방문을라는 개체가 모델 바인더에 객체를 전달하고 경우 업데이트되는 일부 값을 방지 할 수 있습니다 PatientID StatusID 편집에서 어떻게 내가

사용자는 다음과 같은 두 가지 속성을 편집 할 수 있습니다 볼 타임 스탬프 : - 주 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. 내 Visit 모델 클래스에서 [Bind (Include = "....")]를 정의 할 수 없습니다.

그래서 나는이 방법을 계속 사용할지 여부를 결정 드릴 수 없습니다 또는

+0

ViewModel을 사용해야합니다. – SLaks

+0

하지만 ViewModle을 사용하면 ViewModel에서 데이터베이스의 타임 스탬프 값이 관련이 없으므로 타임 스탬프 값을 추적 할 수 있습니다 .. 내 작업 메서드 에서처럼 DbUpdateConcurrencyException을 확인하면 아니요 타임 스탬프 값은 편집 과정에서 발견되었습니다 ... –

+0

답장을 보내 주시면 ViewModel – SLaks

답변

0

당신은 잠재적으로 만 두 필드를 이월 컨트롤러에 Visit 개체를 다시 당겨 수에 따라 더 나은 방법이있다 당신은 채우고 싶습니다. 그러면 두 필드 만 편집됩니다.

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

그러나 이벤트를 단계별로 실행하고 해당 작업에 대한보기 모델을 만들면 관련 필드 만 포함될 수 있습니다.

+0

나는 apprach를 사용하여 방문 개체를 검색하고 값을 다시 가져 오면 DbUpdateConcurrencyException 절대로 제기, 그래서 필요한 경우 DbUpdateConcurrencyException 인상 할 수있는 작업 메서드에 개체를 전달해야합니다 ... –

+0

당신은 타임 스탬프를 기반으로 중복 검사를 사용하지 않습니까? 우리가 다중 사용자 변경을했을 때마다 우리는 "lastupdated"컬럼을 사용했습니다.이 컬럼은 우리가 저장하려고하는 객체와 일치하면 se에 저장시 다시 검사됩니다. (물론 업데이트가 푸시 된 후 업데이트됩니다.). –

+0

"당신은 타임 스탬프를 기반으로하는 중복 검사를 사용하지 않습니다.",하지만 timestamp는 편집 프로세스의 where 절에 포함될 것이고 편집 프로세스를 불러 오면 어떤 개체도 업데이트되지 않았는지 확실하지 않습니다. DbUpdateConcurrencyException이 발생합니다 ,, 즉, 개체 retrivinf 후 개체가 다른 사용자에 의해 수정 된 것을 의미합니다 ... –