2012-09-05 3 views
1

MVC4와 함께 VS2012 RC를 사용하고 있습니다. 모든 의도와 목적을 위해 봇이 MVC3 인 것처럼 보자. 상위 모범 사례와 다른 모델을 사용하는 폼을 사용하여 PartialView를 처리하는 방법에 대한 표준 모범 사례가 무엇인지 알고 싶습니다.부모보기와 다른 모델로 PartialView를 처리하는 방법

예를 들어 사용 가능한 모든 역할의 테이블을 표시하는보기와 사용자가 더 많은 역할을 추가 할 수있는 양식이 있습니다.

홈페이지보기 - Roles.cshtml :

@model IEnumerable<RobotDog.Models.RoleModel> 

<table> 
    @foreach(var role in Model) { 
     <tr> 
      <td class="roleRow">@role.Role</td> 
     </tr> 
    } 
</table> 
<div class="modal hide"> 
    @Html.Partial("_AddRolePartial") 
</div> 

_AddRolePartial.cshtml

@model RobotDog.Models.RoleModel 

@using(Html.BeginForm("AddRole","Admin", FormMethod.Post)) { 
    @Html.TextBoxFor(x => x.Role, new { @class = "input-xlarge", @placeholder = "Role"}) 
    <input type="submit" value="Submit" class="btn btn-primary btn-large"/> 
} 

모델 :보기에 대한

public class RoleModel { 
    [Required] 
    [DataType(DataType.Text)] 
    [Display(Name = "Role")] 
    public string Role { get; set; } 
} 

컨트롤러 :

public ActionResult Roles() { 
    var model = from r in System.Web.Security.Roles.GetAllRoles() 
       select new RoleModel {Role = r}; 
    return View(model); 
} 
PartialView에 대한 16,

컨트롤러 :

[HttpPost] 
public ActionResult AddRole(RoleModel model) { 
    try { 
     System.Web.Security.Roles.CreateRole(model.Role); 
     RedirectToAction("Roles"); 
    } catch(Exception) { 
     ModelState.AddModelError("", "Role creation unsuccessful."); 
    } 

    return ????; // not sure how to pass ModelState back to partialView 
} 

나는 RoleModelIEnumerable<RoleModel>을 개최 뷰 모델을 만드는 방법에 대해 생각하지만 난 싶었 뷰 모델 매번를 만들 필요없이 내가 원하는 것을 달성하기 위해 더 스트림 줄 지어 방법이있을 것처럼 보인다 이 PartialView를 사용하십시오.

답변

1

RoleModel을 Add RoleModel 모달 팝업에 전달하는 방법을 묻고 싶습니다. 새 역할을 만들므로 빈 모델이 필요하다고 가정합니다.

<div class="modal hide"> 
    @Html.Partial("_AddRolePartial", new RoleModel()) 
</div> 

를하거나 항목을 채우는 지원하는 컨트롤러의 supporing GET 메소드와 @Html.RenderAction("AddRole")를 수행합니다 아래처럼에 통과 할 수 있습니다.

public ActionResult AddRole() { 
    var model = new RoleModel(); 
    //populate with any items needed for the Add Role Model View 
    return View(model); 
} 
+0

예.하지만 이는 솔루션의 절반에 불과합니다. AddRole 컨트롤러에 폼을 제출할 때 어떻게 예외가 발생했을 때 폼에'ModelState'를 다시 보냅니 까? – bflemi3

+0

그 경우에는 실제로 두 가지 옵션 만 있습니다. 당신은 AJAX 요청을 사용해야합니다.이 요청은 역할 추가와 관련된 페이지의 부분 만 업데이트하거나, 역할 목록과 빈 역할 ViewModel을 포함하도록 ViewModel을 업데이트하기 위해 포함해야합니다. 나는 AJAX를 추천 할 것입니다. 그렇지 않으면 오류를 다시 보내야 할 때 반복해서 역할을 재 쿼리해야 할 것입니다. AJAX를 사용하면 모델 오류를 쉽게 반환 할 수 있으며 새로 생성 된 역할을 기존 목록에 추가 할 수도 있습니다. – Tommy

+0

그래서 내 컨트롤러가'JsonResult'를 리턴 할 것이고 제출이 성공하면 클라이언트 측에서 페이지를 다시로드하는 것을 처리 할 것입니까? – bflemi3

0

양식 게시가 대상 업데이트 부분 ID가 div 인 ajax 양식 게시물로 변경되는 경우 (효과적으로 Roles.cshtml을 둘러싼) 상위보기에 추가 할 수 있습니다.

return PartialView("Roles", model)

끝에 포스트 액션 다음, Return RedirectToAction(...Roles Partial Action ...)와는 try에서 ("역할") RedirectToAction을 제거하는 새로운 액션 public ActionResult _Roles()를 추가합니다.

+0

이것은 흥미로운 솔루션처럼 들립니다. 주변 div의 요점을 이해하지 못합니다. 정교하게 생각해? 일부 예제 코드는 아마도? – bflemi3

+0

_Roles를로드 할 때 Ajax 결과를 배치 할 수 있도록 컨테이너가 필요합니다. 나는 실수로 컨테이너가 Roles.cshtml에 있다고 제안했다. 컨테이너는 부모보기에 있어야합니다. 나는 나의 대답을 조정했다. 이것에 대해 당신과 함께 노력할 것입니다. –

0

개인적 형태의 부분보기를 사용하여 좋아하지 않아, 부분 뷰가 제대로 서브 모델을 렌더링하지 않기 때문에 (즉, 그들은 계정에 모델의 계층 구조를 고려하지 않음).

이 때문에 Display 및 EditorTemplates가 존재합니다. 이들은 특정 데이터 유형을 렌더링하는 데 적합합니다.

그러나 귀하의보기에는 자체 양식이 없으므로 최종 결과는 상위 모델 모음의 단일 항목 일 뿐이므로 부분보기는 실제로는 더 나은 방법입니다 이는 뷰가 사용하는 모델과 다른 모델을 전달할 수 있기 때문입니다.

다른 사람들이 지적했듯이, 빈 모델을 두 번째 매개 변수로 partial에 쉽게 전달할 수 있습니다.보기에 새 객체를 새로 만드는 것이 싫지만 대체 방법이 상당히 엉망이 될 수 있으므로 선택의 여지가 많지는 않습니다.

관련 문제