2010-11-27 3 views
0

ASP.NET MVC2에서 좋은 개체 지향 디자인을 따르는 데 문제가 있습니다.이 문제는 ViewModel과 뷰가 상호 작용하여 사용자가 정보를 게시 할 수 있습니다.ASP.NET MVC2 :보기,보기 모델 및 게시 요청

사용자가 응답 작업을 사용하여 스레드에 대한 응답을 작성할 수있는 포럼을 구현했습니다. 내 ReplyViewModel에는 threadId에 대한 int와 응답 내용에 대한 문자열이 들어 있습니다. Reply 액션은 ThreadId가있는 ReplyViewModel을 생성하므로 사용자가 응답하는 스레드를 알 수 있습니다. ReplyView는 ReplyViewModel에 강하게 입력되며 사용자가 모델의 내용을 편집 할 수있는 양식을 갖습니다. 그런 다음 사용자는 threadId를 매개 변수로 사용하여 회신 작업에 게시 할 수 있습니다.

제대로 작동하지만 제대로 작동하지 않는다고 생각합니다. 각 게시물에는 두 개의 ReplyViewModels가 포함됩니다. 하나는 threadId이지만 null 콘텐츠이고 다른 하나는 내용이 있지만 null ThreadId입니다. Reply View는 새로운 ReplyViewModel을 생성하고 있으며, 뷰에 전달 된 ReplyViewModel을 편집해야한다고 생각합니다. 그러나 어떻게해야할지 모르겠습니다.

내 질문에 대답하는 것만으로는 충분하지 않습니다 경우
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<mvcForum.ViewModels.ReplyViewModel>" %> 
<%: Html.TextAreaFor(model=> model.content, new{TextMode="multiline", id="postbox"})%> 
<input type="submit" value="Reply" /> 

는, 여기에 전체보기입니다 : 여기

뷰의 제거 다운 버전의 http://pastebin.com/BFGL4p67

뷰 모델은 단지 문자열 문자 그대로가 (내용) 및 int (threadId)입니다.

컨트롤러 :

[Authorize] 
public ActionResult Reply(int id) 
{ 
    ReplyViewModel reply = new ReplyViewModel 
    { 
     ThreadId = id 
    }; 
    return View(reply); 
} 
[HttpPost] 
public ActionResult Reply(int id, ReplyViewModel model) 
{ 
    /**TODO: Catch when no user*/ 
    var newPost = new ForumPost 
    { 
     UserId = (Guid)Membership.GetUser(User.Identity.Name).ProviderUserKey, 
     ThreadId = id, 
     postContent = model.content 
    }; 
    db.AddToForumPosts(newPost); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

그래서 내 질문에 내가 ReplyViewModel의 단일 인스턴스를 사용할 수 난 할 노력하고있어 무엇을 할 수있는 가장 좋은 방법은 년대에, 컨트롤러에서 전달하는 "인가? 보기, 다시 컨트롤러로? "

+0

나는 당신이 여기서 잘하고 있다고 생각한다. 당신이 해결하려고하는 정확한 이슈가 무엇인지 확실하지 않습니까? – CubanX

+0

각 인스턴스에서 하나의 필드 만 사용하여 완전히 분리 된 두 가지 작업을 수행하는 클래스 인스턴스 두 개를 사용하는 것은 잘못되었습니다. 같은 인스턴스를 사용할 수 있다면 더 의미가 있습니다. – divider

답변

1

나는 여러분이하고있는 것이 괜찮다고 생각합니다.

아직 채워지지 않은 문제에 대해 생각해보십시오. 양식을 채울 데이터가과 크게 다를 경우 이됩니다. 여기서 'Get'뷰 모델은 'Post'뷰 모델의 하위 집합이므로 하나의 뷰 모델을 사용하는 것이 좋지만 'Get'데이터와 'Post'데이터가 크게 다른 경우 두 개의 뷰 모델을 사용할 수 있습니다

public class GetReplyFromViewModel //... 
public class PostReplyFromViewModel //... 
두보기 모델이 매우 다르고 자신의보기 모델을 요구하기에 충분히 복잡하지 않으면이 설정을 제안합니다.

기억할 중요한 한 가지 : 보기가 강력하게 유형 'A'로 입력 되었기 때문에 post 메소드의 매개 변수 유형이 'B'유형일 수 없음을 의미하지는 않습니다.

  • 보기의 유형은 단순히 하나가 생성 될 때마다 뷰의 유형 검사와 함께보기에서 편집/인텔리을 결정합니다.
  • 게시 메서드 매개 변수의 형식은 게시 된 HTTP 양식을 지정한 형식으로 변환하기 위해 MVC Model Binding을 사용하기 만합니다.당신이 좋아하고 HTML 필드 경우 포스트 방법은 여전히 ​​같은 매개 변수를 사용 할 수 있다면 전체 Model 변수는 단순히 ThreadId 인 경우

즉보기의 유형은 단순히

<%@ Page Title="" ... Inherits="System.Web.Mvc.ViewPage<int>" %> 

수 제대로 지명되었다.

하지만이 특별한 경우에는 현재 구현이 정상적으로 진행되고 있다고 생각합니다.

+0

도움을 주셔서 감사합니다! 모델 바인딩 문서에 대한 링크는 뷰가 어떤 유형의 매개 변수를 포스트 컨트롤러에 전달할 지 선택하는 방법에 대해 궁금해했기 때문에 특히 유용했습니다. 그러나 나는 여전히 View Controller에 대한 정보를 ViewModel에 저장하여 포스트 컨트롤러에 전달할 수 있는지 궁금해합니다. – divider

+1

글쎄, 그 아이디어는 웹 앱 이후부터 '무국적'상태를 유지하는 것입니다. 기본적으로 get의 뷰 모델은 뷰에서 html로 유지됩니다. 보기에 서버에 대한 HTTP POST를 수행하는 양식이있는 경우 모든 입력이 POST 메시지로 이동하여 MVC 모델 바인더에 의해 처리됩니다. 이 모형 결합 기는 @ 필드 이름을보고 여러분의 post 메서드에있는 객체에 매핑합니다. 따라서 Get/Post 메서드간에 물건을 전달하려면 양식의 숨겨진 필드에 저장하거나 세션을 사용할 수 있습니다. HTH, T.J. 추신 더 많은 것을 배우고 싶다면 TekPub MVC 시리즈 http://tekpub.com/view/aspmvc/1을 제안하십시오. – TJB

+0

다시 한번 감사드립니다. 나는 무국적자가 목표라는 것을 몰랐다. 그래서 나는 그 반대를하려고 노력하고 있었다고 생각한다. 숨겨진 필드가 받아 들여질 수 있다는 것을 알기 쉽습니다. 지금까지 생각한 모든 것을 수행하는 매우 간단한 방법 인 것 같습니다. – divider