2013-04-17 13 views
10

MVCのhtmlhelperのdropdownlistを使用する際に問題が発生しています。ポストバックが発生すると、何も選択されず、リストのモデル内の値と選択された項目がnullになります。ここでMVC DropDownListFor null値

私のモデルです:

namespace MvcTestWebApp.Models 
{ 
    public class Customer 
    { 
     public string name { get; set; } 

     public List<SelectListItem> members { get; set; } 

     public Member selected { get; set; } 
    } 

    public class Member 
    { 
     public string name { get; set; } 

    } 
} 

コントローラー:

namespace MvcTestWebApp.Models 
{ 
    public class CustomerController : Controller 
    { 
     // 
     // GET: /Customer/ 
     public ActionResult Index() 
     { 
      Customer cust = new Customer() { name = "Cust1" }; 
      cust.members = new List<SelectListItem>(); 

      cust.members.Add(new SelectListItem(){Text = "Bob"}); 
      cust.members.Add(new SelectListItem(){Text = "Dave"}); 

      return View(cust); 
     } 

     [HttpPost] 
     public ActionResult Index(Customer customer) 
     { 

      return View(); 
     } 


    } 
} 

とビュー:

@model MvcTestWebApp.Models.Customer 

@{ 
    ViewBag.Title = "Customer"; 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 

<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title> Index </title> 
</head> 

    <body> 


@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Customer Data</legend> 

      @Html.HiddenFor(model => model.name) 

      @Html.DropDownListFor(model => model.selected, Model.members, "--Select--") 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 

     </fieldset> 
} 

    </body> 

</html> 

私が選択リストから何かを選択し、送信ボタンヌルをクリックしている場合返された:

nullselect

誰かが私が間違っていることについていくつかの光を当てることができますか?へ

cust.members.Add(new SelectListItem(){Value = "Bob", Text = "Bob"}); 
cust.members.Add(new SelectListItem(){Value = "Dave", Text = "Dave"}); 

答えて

19

あなたに実行している問題は、MVCは(文字列である)ドロップダウンリストの選択された値を変換する方法を知っていないということです。

+0

もちろんです。ありがとうスティーブン。あなたがどのように知っているときは簡単。 –

+0

+1 "コントローラアクションのパラメータにFormCollectionコレクションを追加して、MVCがメソッドに渡すオブジェクトを構築するためにMVCが使用している情報を確認できます。"私は間違って別のフォームのためのアトリビュートフォームを設定し、私は数時間の間、私のDropDownListForはGuidを返すことを望んでいないと思った... FormCollectionは、 – cadi2108

0
cust.members.Add(new SelectListItem(){Text = "Bob"}); 
cust.members.Add(new SelectListItem(){Text = "Dave"}); 

値を設定するようにしてくださいオブジェクトメンバー。

あなたがすべきことは、ドロップダウンに値を設定して戻り値を取得するために使用されるselectedValueプロパティです。

新規顧客クラス:

public class Customer 
{ 
    public string name { get; set; } 

    public List<SelectListItem> members { get; set; } 

    public string selectedValue { get; set; } 

    public Member selected { get; set; } 
} 

は、ドロップダウンリストコントロールを更新:

@Html.DropDownListFor(model => model.selectedValue, Model.members, "--Select--") 

これは、プロパティSelectedValueのにドロップダウンリストから選択した値を返します。

メンバーのリストが返される理由は、HTMLがドロップダウンリストのオプションを返さないため、選択された値のみを返すためです。情報がこのメソッドに渡されると、入力フォームの値のみが与えられます。

あなたが戻ってサーバーに送信されるどのような情報あなたが開発者コンソールを使用してリターンHTTPリクエスト

および/または

をキャプチャすることができます確認したい場合は、コントローラのパラメータにFormCollection collectionを追加することができますMVCがメソッドに渡すオブジェクトを構築するためにMVCが使用している情報を確認するアクション。

+0

まだ動作しません。グッドトゥートゥー:)私はそれがfacepalm後にそれをしたかもしれないと思ったが、それはまだnull。私もSelectListItemにcust.selectedを変更しようとしましたが、これはどちらかといえません。 –

+1

@ChristopherTownsendヘルパープロパティ '@ Html.DropDownListFor(model => model.selected.name、Model)を変更します。メンバ " - 選択 - ") 'とGETアクションでオブジェクトを作成する' new Customer(){name = "Cust1"、selected = new member()} ' – webdeveloper

-3

jQueryプリペンドを使用すると、問題を簡単に解決できます。

$("#idOfSelectTag").prepend(' 
           <option selected="selected" value="null"> 
           -- Select School -- 
           </option> 
          ');