2011-12-26 6 views
0

私はMVC3の私のRESTfulなアプリケーションでは、このアクションがあります。建物アクションパラメータオブジェクト

ViewModelクラスは(私が着る `tに/クライアントJavaScriptからデータを渡すためのクラスです
[HttpPut] 
public void Rest(ViewModel view_model, int id) 
{ 
    //doing something with view_model 
} 

を)の純粋なDBエンティティを渡したい:

public class ViewModel 
{ 
    public ViewModel() //parameterless constructor, needed for accepting as parameter in action 
    { 
    } 

    public ViewModel(Model m) 
    { 
     id = m.ID; 
     Title = m.Title; 
    } 

    public int? id { get; set; } 

    private string _title; 
    public string Title 
    { 
     get 
     { 
      if (String.IsNullOrWhiteSpace(_title)) throw new Exception("Empty field"); 
      return _title; 
     } 
     set 
     { 
      _title = value; 
     } 
    } 
} 

が、私はそのデータをPUTリクエストを行います。

{ "id" : 7, "Title" : "Hello world!" } 

私はその "空フィールド"の例外を取得します。何かのように思えるが、それはが入ってくるとに設定されていても前に、 Titleプロパティを取得しようとしている「こんにちは、世界!」データ。 なぜですか?

実際のXHRリクエストで、この操作全体がどのように動作するか、つまりアクションパラメータとして指定されたオブジェクトViewModelをどこから取得できますか。

ありがとうございました。

答えて

1

到着した「Hello world!」で が設定されていても、何かがTitleプロパティを取得しようとしているようです。データ。どうして?

デフォルトのモデルバインダーです。具体的にはBindPropertyメソッドです。このメソッドはバインディング時に呼び出され、リフレクションを使用してゲッターを呼び出します。モデルバインダーはオブジェクト階層グラフを再帰的に反復するので、最初にプロパティの値を取得し、バインディングコンテキストを構築し、各プロパティのメタデータをモデル化してからSetPropertyメソッドを呼び出す必要があります。

あなたがタイトルプロパティが空に使用したくない場合は、検証メカニズムと自動実装プロパティ:ModelState.IsValidもしあなたのRESTfulなアクションのチェックで

[Required] 
public string Title { get; set; } 

してから。それははるかに簡単でMVCishです:

[HttpPut] 
public ActionResult Rest(ViewModel view_model, int id) 
{ 
    if (!ModelState.IsValid) 
    { 
     ... 
    } 

    // doing something with view_model 
    ... 
} 
+0

ありがとうございました! – Roman