2017-07-10 8 views
0

これは、ユーザーがsportseventsに登録できるHTMLフォームです。 Tシャツサイズについて、ユーザー別のプロファイル(例えば自分の子供たち)を登録することができ、すべてのイベントが潜在的にテキストボックスのような、いわゆる「その他の属性」を持つことができるなどAsp.NET MVC DynamicFormの値は投稿されましたがコントローラーに渡されません

@model Models.EventRegistrationModel 
@{ 
    Layout = null; 
    var playerCount = Model.PlayersToRegister.Count; 
} 
@using (Html.BeginForm("RegisterForEvent", "Event", FormMethod.Post)){ 
    @Html.AntiForgeryToken() 
    <div class="form-group"> 
    @for (int i = 0; i < playerCount; i++) 
    { 
     <div> 
       <p>@Model.PlayersToRegister[i].User.FullName</p> 
     </div> 
     <div 
       @Html.CheckBoxFor(model => Model.PlayersToRegister[i].PlayerShallGetRegistered) 
     </div> 
     //this is the "Additional Attributes"-section for each user-profile 
     @Html.Raw(Model.PlayersToRegister[i].Form.RenderHtml()) 
    } 
    </div> 
<input type="submit" value="Confirm Registration"/> 
} 

私はこれらのイベントを作成していないので、私はできませんこれらの「追加の属性」はどのように見えるのですか。それがDynamicFormを使用して動的にレンダリングされる理由です。 私の問題は、コントローラのこれらの属性のユーザー入力にアクセスできないことです。ブラウザのコンソールをチェックすると、入力がポストされているのがわかりますが、動的フォームの値をチェックすると、常に「null」と表示されます。 はここに私のコントローラです:

[HttpPost, ValidateAntiForgeryToken] 
    public ActionResult RegisterForEvent(EventRegistrationModel model) 
    { 
     for (int i = 0; i < playerList.Count; i++) 
     { 
      var form = Session["Form" + i] as Form; 
      model.PlayersToRegister[i].Form = form; 
      //var test = form 
      //var testtest = test.GetResponses(false); 
     } 
     return RedirectToAction("EventOverview"); 
    } 

あなたが見ることができるように、私は、フォームの「GetResponses」方法 - を使用しようとしましたが、それはnullを返しました。これはあなたが一度に一つのプロファイルを登録することしかできなかった古いバージョン、で働いていたとして、私は、セッションを介して値を取得しようとしています現時点では

public List<Response> GetResponses(bool completedOnly) 
    { 
     return InputFields.OrderBy(inputField => inputField.DisplayOrder).Select(field => new Response 
     { 
      Title = field.Title, Value = field.Response 
     }).Where(response => !completedOnly || !String.IsNullOrEmpty(response.Value)).ToList(); 
    } 

。セッション変数は、上記のビューを返すActionResultに割り当てられます。

私は過去のさまざまなスレッド(ModelState.Clearなど)でさまざまなソリューションを試していましたが、残念ながら成功したものはありませんでした。

さらに詳しい情報やコードなどが必要な場合は、私にお知らせください。

+0

モデルバインダーは、フォームを 'EventRegistrationModel'にマッチさせることができないので、nullです。 'EventRegistrationModel'の代わりに' FormCollection'クラスを使ってみましたか? – nurdyguy

+0

あなたはポストアクションの結果を意味しますか? – Rustius

+0

この 'public ActionResult RegisterForEvent(FormCollection model)'を試して、データがモデル上に現れるかどうか確認してください。 – nurdyguy

答えて

0

フォームが動的なので、postメソッドで動的モデルを使用することができます。

[HttpPost, ValidateAntiForgeryToken] 
public ActionResult RegisterForEvent(FormCollection collection) 
{ 
    // stuff.... 
} 

あなたは入って来コレクションを解析する作業のビットを行う必要があるでしょうが、それはフォームから投稿されましたすべてを持っている必要があります。このような何かを試してみてください。一般的に、私は実際に制御不能になるので、これをお勧めしません。よく定義されたビューモデル(元の投稿で行ったように)を持つことは、一般的にははるかに優れています。しかし、時にはあなたは本当に何かをダイナミックにする必要があります。

+0

私がすでに言ったように、ありがとう、これは本当に私を助けました。 – Rustius

+0

うれしい私は助けることができます。 – nurdyguy

関連する問題