2012-07-11 2 views
0

MVC 3을 사용하여 DB에있는 요소를 삭제할보기가 있습니다. 서비스 계층은 작업을 승인하기 전에 모든 논리가 제자리에 있는지 확인합니다. 역할 위반의 경우 메시지가 Html.Summary에 표시되므로 삭제 작업이 중단됩니다.데이터가 게시 된 후에보기에 표시되지 않습니다.

내 문제는 서비스 레이어의 Html.Summary에있는 메시지가 다양한 필드의 데이터를 잃어 버려서 항목에 대한 ID, 이름 및 설명을 볼 수 없기 때문에 발생합니다.

나를 올바른 방향으로 안내해 줄 수 있습니까? 내가 뭘 잘못하고있어? 감사합니다

public ActionResult Delete(int id) 
    { 
     Typology typology = _typologytService.FindById(id); 
     TypologyDeleteViewModel deleteViewModel = Mapper.Map<Typology, TypologyDeleteViewModel>(typology); 
     return View(deleteViewModel); 
    } 

    // 
    // POST: /ManageTypologies/Delete/5 

    [HttpPost] 
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel); 
      _typologytService.Delete(typology.TypologyId); 
      if (ModelState.IsValid) 
       return RedirectToAction("Index"); 
     } 
     return View();   
    } 

@model xxx.ViewModels.TypologyDeleteViewModel 
@{ 
    ViewBag.Title = "Delete"; 
} 
<h2> 
    Delete</h2> 
<h3> 
    Are you sure you want to delete this?</h3> 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(model => model.TypologyId) 
    <fieldset> 
     <legend>TypologyDeleteViewModel</legend> 
     <div class="display-label"> 
      TypologyId</div> 
     <div class="display-field"> 
      @Html.DisplayFor(model => model.TypologyId) 
     </div> 
     <div class="display-label"> 
      Name</div> 
     <div class="display-field"> 
      @Html.DisplayFor(model => model.Name) 
     </div> 
     <div class="display-label"> 
      Description</div> 
     <div class="display-field"> 
      @Html.DisplayFor(model => model.Description) 
     </div> 
     <p> 
      <input type="submit" value="Delete" /> 
     </p> 
    </fieldset> 
} 
<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

답변

1

에 게시 방법 변경 : 잘못된 모델 상태를 반환 할 때이보기로 다시 모델을 통과하지 않는

[HttpPost] 
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel); 
      _typologytService.Delete(typology.TypologyId); 
      if (ModelState.IsValid) 
       return RedirectToAction("Index"); 
     } 
     return View(deleteViewModel);   
    } 

. 또한, 위의 코드에서 ModelState.IsValid 속성을 두 번 확인하는 이유가 있습니까? ModelStateError를 추가 할 곳이 보이지 않고 두 번째 if 문에서 경로가 없습니다.

마지막으로 deleteViewModel에 드롭 다운 목록 등 (이 경우 표시되지 않음)이 포함 된 경우보기를 반환하기 전에 다시 채워야합니다.

편집 귀하의 경우에는

, 다른 속성에 대한 위의 당신 때문에 작동하지 않을 것입니다 사용하지 않는 EditorFor HTML 도우미. 귀하의 의견은 서버에 다시 게시되지 않는 설명 등을 위해 <span> 태그에 해당하는 내용을 뱉어 내고 있습니다. 돌아 오는 유일한 것은 <input type="hidden" 필드에 있기 때문에 ID 속성입니다. 모든 값이 다시 게시되도록 당신이 당신의 ID와 일을 같이 숨겨진 입력 필드에 값을 저장,

[HttpPost] 
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel); 
      _typologytService.Delete(typology.TypologyId); 
      if (ModelState.IsValid) 
       return RedirectToAction("Index"); 
     } 
     Typology typology = _typologytService.FindById(typology.TypologyId); 
     TypologyDeleteViewModel deleteViewModel = Mapper.Map<Typology, TypologyDeleteViewModel>(typology); 
     return View(deleteViewModel);   
    } 

또는 -

따라서 귀하의 경우, 당신은 당신의 행동 방식을 업데이트해야합니다 서버에 연결하면 데이터베이스 호출을 다시 할 필요가 없습니다.

+0

감사의 말 Tommy, 코드를 사용하여 @ Html.HiddenFor (모델 => model.TypologyId)로 숨겨진 필드를 추가해야했습니다. @ Html.HiddenFor (model => model.Name) @ Html.HiddenFor model => model.Description) now working – GibboK

+0

_typologytService는 ModelState가 messageg를 추가하지 못하게 만들 수있는 Service Layer이므로 ModelState를 두 번 확인합니다. 보기에 숨겨진 필드를 추가해야하는 이유는 무엇입니까? 많은 감사합니다 나는 당신의 대답을 받아 들일 것입니다 :-) – GibboK

+1

두 계정의 Gotcha - 방금 숨겨진 입력을 되돌려 보내지 않고 어떻게 할 수 있는지에 대한 나의 대답을 업데이트했습니다. 그러나 어느 쪽이든 작동합니다! – Tommy

관련 문제