2012-01-31 18 views
4

私はいくつかのエンティティの中から選択するだけのフォームを持っています。Asp.net MVC 3:コントローラーでモデルが空になりますか?

は、ビューモデルを作成::

public class EntityChooserModel 
    { 
     public IEnumerable<Entity> AvailableEntities { get; set; } 
     public int SelectedId; 
    } 

私はコントローラに2つのアクション、[HTTPPost]との1、ないものをしましたので、ここで

は、私がやったものです。どちらの場合も、セッションデータである "SessionUserData"がデータモデルバインディングを介してバインドされています。

 [Authorize] 
     public ActionResult EntityChooser(SessionUserData sessionData) 
     { 
      List<Entity> entities = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).ToList(); 


      Entity entity = sessionData.IdCurrentEntity != null ? entities.Where(e => e.Id == sessionData.IdCurrentEntity).First() : entities.First(); 

      return View(new EntityChooserModel() { SelectedId = entity.Id, AvailableEntities = entities }); 
     } 

[Authorize] 
    [HttpPost] 
    public ActionResult EntityChooser(EntityChooserModel model, SessionUserData sessionData, String returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      Entity entity = _userStore.GetRoles(User.Identity.Name).Select(ur => ur.Entity).Where(e => e.Id == model.SelectedId).First(); 
      sessionData.IdCurrentEntity = entity.Id; 
      RedirectToDefaultPage(returnUrl); 
     } 
     return View(model); 
    } 

そして、強く型付けされたビュー:

@model My.Full.Namespace.EntityChooserModel 
@{ 
    ViewBag.Title = "EntityChooser"; 
    Layout = "~/Views/Shared/_LoginLayout.cshtml"; 
} 
<div id="login-wrapper"> 
    <div id="title"> 
     <h1>Login</h1> 
    </div> 
    <div id="login"> 
     @using (Html.BeginForm("EntityChooser", "Auth", FormMethod.Post, new { id = "ChooseFormId" })) 
     {    
      @Html.ValidationSummary(true, "Loggin error") 
      <div> 
       <span>Choose an entity:</span> 
       @Html.DropDownListFor(x => x.SelectedId, new SelectList(Model.AvailableEntities, "Id", "Name")) 
      </div> 
      <p class="right-aligned"> 
       <a href="javascript:document.getElementById('ChooseFormId').submit();" class="adm-button"> 
        <span class="next-btn"><span>Select</span></span></a> 
      </p> 
      <input type="submit" style="display: none" /> 
     } 
    </div> 
</div> 

問題は、私は2番目のモデルでデータを受信したとき、私は空のオブジェクトをしたということです。コレクションは空で、idはデフォルト値(0)に設定されています。

どうしたのですか?私はこれについて逃したものを見つけることができません。

それは私がForModel()ないMVCのフォームを行う初めてだ、と私はドロップダウンリストを使用したのは初めてで

答えて

7

あなた<form>が含まれている唯一の入力要素が送信するダウンリスト一滴ですPOST時に選択した値のみをサーバーに送信します。これは、あなたのAvailableEntitiesコレクションプロパティが空である理由を説明します。

限りSelectedIdフィールドが空であるなぜあなたはフィールドとしてそれを定義していない財産としているので、そのままでは。既定のモデルバインダーは、プロパティでのみ機能します。あなたはそれを埋めることにしたいのであれば、あなたはプロパティとして定義する必要があります。

public int SelectedId { get; set; } 

は限り AvailableEntitiesプロパティが関係しているとして、あなたが選択したIDを使用してPOSTアクションでリポジトリからそれを取り込むことができます。

+0

GOD LIKE!なぜ私は財産の代わりにここにフィールドを置くのかわからない!どうもありがとうございます! – J4N

関連する問題