2012-01-24 19 views
7

私はMVCをかなり新しくしており、モデルバインディングに慣れようとしています。私はフォームで作成したシンプルなモデルを持っています。しかし、私はフォームを投稿するときにのみ、テキストボックスの値がコントローラに持ち越されています。 DisplayTextForを使用して記述フィールドも必要です。これはカスタムモデルのバインダーを作る必要があるのでしょうか?私は、ショートカットを取ることができますし、テキストだけのように見えるので、説明がテキストの境界線がないので、正しい方法をしたい。ここに私のコードは次のとおりです。MVC3はモデル全体を投稿していません

public class FullOrder 
{ 
    public List<FullOrderItem> OrderList { get; set; } 
    public string account { get; set; } 
    public string orderno { get; set; } 
} 

public class FullOrderItem 
{ 
    public int? ID { get; set; } 
    public int? OrderId { get; set; } 
    public string Description { get; set; } 
    public int Qty { get; set; } 
    public decimal? Price { get; set; } 
} 

はここで見る

<table class="ExceptionAltRow"> 
    <tr style="background-color: #DDD;"> 
     <td class="strong" style="width:500px;"> 
      Description 
     </td> 
     <td class="strong" style="width:100px;"> 
      Qty 
     </td> 
     <td class="strong" style="width:100px;"> 
      Previous Purchases 
     </td> 
    </tr> 
    @for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 
    </table> 

はここコントローラーです:

[HttpPost] 
public ActionResult AddItem(FullOrder f) 
{ 
    //doesn't work description is not passed but qty is 
} 

は、私は私のモデルは単に渡すために得ることができる方法はあります私のモデルからテキストボックスのバインドされた項目ではないにもかかわらず、記事の説明?

答えて

2

アプリケーションに投稿される唯一のデータは、フォームフィールドが無効になっていない限り、送信されているフォームで利用可能なデータだけです。 custom model binderを実装することで、コントローラに表示される内容を上書きすることができます。この場合

、フォームが単一のテキストフィールドの多くのインスタンスで構成されています

@Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 

あなたが説明と記入他のものが欲しい場合は、フォーム上に存在する必要があります。

@Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 

がDisplayTextFor機能のみをブラウザのDOMへのテキスト出力に起こっているWhat does Html.HiddenFor do?

+0

おかげ説明値が含まれています送信されたフォーム。 – mscard02

+0

答えが役に立つ場合は、上向きの矢印をクリックしてそのように示す必要があります。 –

0

も参照してください:彼らは見えるようにする必要がない場合は、HiddenForヘルパーを使用することができます。 MVCフレームワークのバインディングは、基本的にPOST/GET変数を調べ、それらの値を自動的にモデルに設定します。

データを自動的にバインドする場合(説明テキストなど)、そのデータをある種の入力および/または隠​​しフィールドに格納する必要があります。隠しフィールドは機能しますが、HTMLに余分な要素を入れているため、ユーザーがFirebugなどで編集することもできるため、非効率的です。

私の推薦と私がいつもやっている情報の一部が戻って掲載していないことを期待するものであり、単にコントローラのアクションの中に明示的に設定します。もちろん

[HttpPost] 
    public ActionResult AddItem(FullOrder f) 
    { 
     // Next line is just showing that you should get the existing order 
     // from your data layer 
     FullOrder existingOrder = orderRepository.GetExistingOrder(); 

     // Now loop through f.OrderList and update the quantities 
     foreach(OrderItem item in f.OrderList) { 
      // Find the existing item and update the quantity. 
     } 

     // Now you have the original information from the DB along with 
     // updated quantities. 

     // Save results or do whatever is next 
     existingOrder.Save(); 
    } 
1

あなたはそれを動作させることができませんその方法

最初に、モデルバインディングは基本的にクライアント側の入力からのデータ送信を使用して行われることを知っておく必要があります。 Html.DisplayTextForヘルパーは入力を生成しません。単純なテキストを生成します。テキストはデータに関与せず、フォームの送信時にクライアントから送信されるため、モデルにバインドされません。 Request.Formプロパティを見ると、証拠が表示されます。記述フィールドはありません。

テキストを表示し、フォームの値に説明を追加する場合は、隠しフィールドを使用します。MVCは、この

@for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
       @Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 

ためにこの道をヘルパーを持って、私は知っているために必要な正確に何を、助けのためにあまりにも

+0

HiddenForはタグとしてレンダリングされていることを知っておきましょう。 – dotnetN00b

関連する問題