2012-07-13 5 views
2

면도기를 사용하여 하위 모델이있는 복잡한 모델의 양식을 렌더링 할 때 부분 모델을 렌더링 할 때 부분 뷰를 사용합니다.면도기 부분보기 접두사 필드 이름

간단한 예 모델 :

public class BlogPost 
{ 
    public string Content { get; set; } 
    public List<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public string Content { get; set; } 
} 

BlogPost.cshtml :

@model BlogPost 

@Html.TextAreaFor(x => x.Content) 

@for (int i = 0; i < Model.Comments.Count; i++) 
{ 
    @Html.Partial('Comment', Model.Comments[i]) 
} 

Comment.cshtml :이 문제에 대한 지금

@model Comment 

@Html.TextAreaFor(x => x.Content) 

:

모든 필드의 값을 BlogPost을 매개 변수로 사용하는 컨트롤러 작업으로 보내려한다고 가정 해보십시오. 필드는과 같이 컨트롤러에 다시 게시 될 예정 :

콘텐츠 =의 + 블로그 게시물 & 콘텐츠 +의 + 콘텐츠 + =의 + 첫번째 + 코멘트 & 내용 =의 + 초 + 댓글

그러나 우리가 MVC가 올바르게 매핑 BlogPost 뷰 모델에, 우리는이 명명 규칙이 필요 있어야합니다 :

내용 =의 + 블로그 게시물 & 댓글 [0] .Content =의 + 첫번째 + 코멘트 &을 +의 + 콘텐츠 +를 댓글 [1] .Content = + 초 + 댓글

어떻게 이런 방식으로 깨끗하게 달성 할 수 있습니까? 우리는 모두이 디자인을 손상하는 것 두 가지 방법을 생각할 수 있습니다

  • 가 어느 우리는 우리가 지금처럼 텍스트 영역을 정의 할 수 있도록 부분 뷰에 모델로 BlogPost을 전달합니다 @Html.TextAreaFor(x => x.Comments[i].Content)합니다. 그러나 이것은 부분 뷰를 부모 뷰 모델에 연결하는 것을 의미합니다. 부분 뷰가 부모 뷰 모델에 의존하는 경우 불가능한 동일한 부분 뷰를 다른 컨텍스트에서 사용해야하는 시나리오를 생각할 수 있습니다. 더구나, i은 어떻게 든 부분 뷰로 전달되어야합니다.
  • 또는 문자열을 사용하여 모든 단일 필드의 이름을 명시 적으로 정의하는 것으로 넘어갑니다 : @Html.TextArea(ViewBag.Prefix + ".Content").

모든 필드 이름 에 특정 접두사를 적용 할 부분도 말할 수있는 방법이 있습니까? 작성 및 유형 Comment의 EditorFor 템플릿 경우, MVC 아름답게 당신을 위해이 모든 것을 처리 할

답변

2

chiccodoro. 그러나 이는 행이 이미 DB에있는 경우에만 제대로 작동합니다. SO에서 Exampel는 :

Submiting Parent & Children in razor

당신이 비행에 새 행을 작성해야하는 경우에, 당신은 필요에 따라 필드가 작동 할 수 있도록 속임수 약간을 사용해야합니다. 나는 런타임시 수집 항목을 추가 할 수있게하고 여전히 눈에 거슬리지 않은 유효성 검사 등을 유지할 수있는 steven sandersons 웹 사이트의 기사를 사용했습니다.이 질문 및 관련 기사 참조 :

Editing a Variable Length List, ASP.NET MVC 3 Style with Table

+0

Thanks, EditorFor가 중요했습니다! 또한 새 행을 처리하는 방법에 대한 Steven-Sanderson-Tips를 읽으면서 기쁩니다. – chiccodoro

+0

chiccodoro - 기꺼이 귀하의 불만을 해결했습니다. 스티븐 샌더슨 물건은 말 그대로 내가 말한 것보다 더 많은 시간을 보냈습니다. –