2012-03-05 11 views
1

私は、MVC 3プロジェクトのモデルのための強く型付けされた剃刀のビューを持っています。基本的にはモデルを編集するためのものです。MVC 3 POSTデータとIdフィールド

このモデルには、データベースキーと他の文字列フィールド(そのviewModelと質問のポイントではないものすべて)のIdフィールドが含まれています。

私はフォームと送信ボタンだけを持っているだけです。ビューがコントローラにポストされると、コントローラ内のモデルは、自動的に魔法のように埋められていると思われるIdフィールドを除いて、すべてのフィールドを空にします。

Idフィールドは、ビュー内に対応する '入力'要素がない場合、どのようにモデルに入力されますか。

これは恐らく疑問な質問ですが、私が読んでおくべきものへのリンクさえもありがたいです。ありがとう。

答えて

4

私はそれがルートパラメータとしてURLから来ると思います。

たとえば次のようなコントローラがあります。

public class HomeController: Controller 
{ 
    public ActionResult Index(int id) 
    { 
     vqr model = GetModel(id); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     // the model.Id property will be automatically populated here 
     // because the request was POST /home/index/123 
     ... 
    } 
} 

と次のビューを:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <button type="submit">OK</button> 
} 

今、あなたは/home/index/123をGETするためにナビゲートし、次のマークアップを取得:

<form action="/home/index/123" method="post"> 
    <button type="submit">OK</button> 
</form> 

フォームのaction属性に注目してください。それがIDの出所です。基本的にHtml.BeginForm()ヘルパーは、アクション属性を生成するときに現在のURLを使用します。現在のURLは/home/index/123です。これは使用されるURLです。

Global.asaxに既定のルートを残しておくと、URLの末尾に{id}ルートトークンが使用されるため、既定のモデルバインダーでは、ビューモデルのIdプロパティにバインドされます。

+0

ありがとうございました。私はそれがルートパラメータから来ていたと推測していたが、その方法は不明であった。 – NVM

1

あなたはおそらく次のようなURLをヒットしている:/ MyObjectに/編集/ 15

これは、あなたがあなたの上に空白のフォームを持っているページを返しています。次に何が起こるか

はあなたのルーティングルールは'15を拾っているのと同じフォーマットを有するバックので、ポストの今BACK/MyObjectに/編集/ 15に

を掲示さHTML.BeginForm()を持っています'それをあなたのIDに戻してください。

0

IDフィールドを非表示フィールドとして追加しましたか?

@ Html.HiddenFor(x => x.ID)

関連する問題