2010-11-27 6 views
0

ASP.NET MVC2でオブジェクト指向の設計がうまくいかないと問題が発生していますが、ViewModelとビューの相互作用が不十分であると思います情報を投稿すること。ASP.NET MVC2:ビュー、ビューモデル、および投稿のリクエスト

私は、ユーザーが返信アクションを使用してスレッドへの返信を作成できるフォーラムを実装しました。私のReplyViewModelには、threadIdのintと応答の内容の文字列が含まれています。 ReplyアクションはThreadIdでReplyViewModelを作成するので、ユーザーが返信しているスレッドを知ることができます。 Reply Viewは、ReplyViewModelに強く入力され、ユーザがモデルのコンテンツを編集できるようにするフォームを持っています。ユーザーは、threadIdをパラメータとして返信アクションに投稿することができます。

これは機能しますが、これは正しい方法ではないと私は思っています。各投稿には2つのReplyViewModelが含まれています.1つはthreadIdでコンテンツはnull、もう1つはコンテンツではなくnullのThreadIdです。 ReplyViewは新しい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

ViewModelには、文字通りの文字列(コンテンツです)と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

クラスの2つのインスタンスを使用して、各インスタンスで1つのフィールドのみを使用して2つの完全に別々のものを実行するのは間違っているようです。私が同じインスタンスを使用できるかどうかは、もっと意味があります。 – divider

答えて

1

あなたがしていることは問題ないと思います。

のデータは、フォームに入力するデータが投稿されるデータと大きく異なる場合、となる可能性があります。ここでは、 'Get'ビューモデルは 'Post'ビューモデルのサブセットであるため、1つのビューモデルを使用するのは問題ありませんが、 'Get'のデータと 'Post'のデータが大きく異なる場合は、

public class GetReplyFromViewModel //... 
public class PostReplyFromViewModel //... 

しかし、両方のビューモデルが非常に異なり、十分に複雑で、独自のビューモデルを必要としない限り、私はこれに対して示唆します。

「A」と入力すると強く型付けされているという理由だけで、という重要なことは、postメソッドのパラメータの型に 'B'を入力できないことを意味しません。

  • 1が作成されるたびにビューのタイプは、単にビューの型チェックと一緒にビューのコンパイル/インテリセンスを決定します。
  • ポストメソッドパラメータのタイプは、MVC Model Bindingを使用して、ポストされたHTTPフォームを指定したタイプに変換するだけです。あなたが好きとあなたのhtmlフィールド場合は、POSTメソッドは、まだ同じパラメータを取ることができれば、全体Model変数は単にThreadIdある場合は

言い換えれば、あなたのビューのタイプは、単に

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

可能性があり適切に命名されました。

この特定のケースでは、私は現在の実装がうまくいると思います。

+0

助けてくれてありがとう!モデルバインディングのドキュメントへのリンクは、ビューがどのようなタイプのパラメータをPostコントローラに渡すかについて私が不思議に思っていたため、特に役に立ちました。私はまだ、ViewModelに格納することで、GetコントローラからPostコントローラに情報を渡すことができるかどうか(または、もしかすると)疑問に思っています。 – divider

+1

まあ、そのアイデアは、ウェブアプリケーション以来、物事を「ステートレス」に保つことです。基本的に、getからのビュー・モデルは、ビューのHTMLとして永続化されます。ビューにサーバーへのHTTP POSTを行うフォームがある場合、すべての入力はPOSTメッセージに入り、MVCモデルバインダーによって処理されます。このモデルバインダーは、@フィールド名を調べて、postメソッドのオブジェクトにマップします。したがって、Get/Postメソッド間で物事を渡すには、それらをフォームの隠しフィールドに格納したり、セッションを使用したりすることができます。 HTH、T.J. P.S.詳細を知りたい場合は、TekPub MVCシリーズをお勧めします。http://tekpub.com/view/aspmvc/1 – TJB

+0

ありがとうございます。私は無国籍者が目標だったことを知らなかったので、私はその反対をしようとしていたと思います。隠しフィールドは受け入れ可能であることを知っておいてください。これは、私がこれまで考えてきたことを行う非常に簡単な方法のように思えるからです。 – divider

関連する問題