18

性別選択フィールド (--Select--、男性、女性) があり、コントローラーに入力しています。ページが読み込まれるときに、モデルで選択されている性別がpm.Gender、ページが読み込まれるときに自動的に選択されるようにします。

からの値は次のpm.Genderように返されます。

  • " "
  • 「M」
  • 「フ」

意見:

<%: Model.Gender %>
<%: Html.DropDownListFor(m => m.Gender, (IEnumerable<SelectListItem>)ViewData["gender"], new { @class = "span2" })%>

コントローラ:

gender = new[] { "Select", "Male", "Female" };
List<SelectListItem> genderselectList = new List<SelectListItem>();
foreach (string item in gender)
{
   SelectListItem sli = new SelectListItem { Text = item, Value = item };

   if (item.Trim().StartsWith(pm.Gender))
      sli.Selected = true;

   genderselectList.Add(sli);
}

ViewData["gender"] = genderselectList;

アプリケーションをデバッグした後、選択されるはずの適切な値のgenderselectList適切なデータが含まれていることがわかります。Selected = trueしかし、ページが読み込まれると、Html.DropDownListFor.

編集:どのブラウザでも機能しません。

この問題の原因を知っている人はいますか? どんな助けでも大歓迎です。

乾杯。

編集:(Kafのソリューションを実装した後)
これが、Kafのソリューションを実装した後に私がやっていることです。

意見:

<%: Html.DropDownListFor(m => m.Gender, (SelectList)(ViewData["gender"]), new { @class = "span2" }) %>

コントローラ:

gender = new[] { "Select", "Male", "Female" };
List<SelectList> genderselectList = new List<SelectList>();
foreach (string item in gender)
{
    SelectList sli;

    if (item.Trim().StartsWith(pm.Gender))
        sli = new SelectList(GetGender(), item, item, item); 
    else
        sli = new SelectList(GetGender(), item, item);
        //without selectedValue

    genderselectList.Add(sli);
}

ViewData["gender"] = genderselectList;

これを行うと、次の例外が発生します。
Unable to cast object of type 'System.Collections.Generic.List`1[System.Web.Mvc.SelectList]' to type 'System.Web.Mvc.SelectList'.

私が間違っていることを知っている人はいますか?

4

6 に答える 6

23

(ViewBag / ViewDataを使用するよりも)SelectListに強く型付けされたプロパティを使用する方がよいことをお勧めします。あなたが期待しているのは、モデルで行われた性別の選択でドロップダウンリストが事前に選択されていることだと思います。これが解決策です(コードは100%クリーンではありませんが、これは機能します)

モデル

public class TestModel
{
    public string Gender { get; set; }

    public IEnumerable<SelectListItem> GenderList
    {
        get
        {
            List<SelectListItem> list = new List<SelectListItem> { new SelectListItem() { Text = "Select", Value = "Select" }, new SelectListItem() { Text = "Male", Value = "Male" }, new SelectListItem() { Text = "Female", Value = "Female" } };
            return list.Select(l => new SelectListItem { Selected = (l.Value == Gender), Text = l.Text, Value = l.Value });
        }
    }
}

コントローラのアクション

public ActionResult MyView()
{
    TestModel m = new TestModel();
    m.Gender = "Female";
    return View(m);
}

MyView.cshtml

@model TestModel

@{
    ViewBag.Title = "MyView";
}

<h2>MyView</h2>
@using (Html.BeginForm())
{
    <div>
          @Html.DropDownListFor(model => model.Gender, Model.GenderList)
    </div>
}

出力

「女性」オプションが選択されたドロップダウン

ここに画像の説明を入力してください

編集

コメントに基づいて、サンプルプロジェクトへのリンクを以下に示します

1)https://github.com/prashanth-t/DropdownDemo_BareBones(MVC 4の空のテンプレートを使用します。最小限のファイルサイズで小さくなります)

2)https://github.com/prashanth-t/DropdownDemo(MVC 4インターネットアプリケーションテンプレートを使用。ファイルサイズが大きい)

于 2012-05-11T15:59:25.767 に答える
3

selectで性別を取得する方法:

private Dictionary<string,string> GetGender(){
    Dictionary<string, string> myDic = new Dictionary<string, string>();
    myDic.Add(System.DBNull.Value.ToString(), "Select");
    myDic.Add("Male", "Male");
    myDic.Add("Female", "Female");
    return myDic;
}

コントローラ内:

//without selectedValue
ViewData["gender"]  = new SelectList(GetGender(), "Key", "Value");

また

//"Male" as selectedValue
ViewData["gender"]  = new SelectList(GetGender(), "Key", "Value", "Male");

ビューで:

Html.DropDownListFor(m => m.Gender, (SelectList)(ViewData["gender"]),
                        new { @class = "span2" })
于 2012-05-11T15:00:03.803 に答える
2

代わりにコントローラーでこれを試してください:

string[] gender = new string[] {"Male", "Female"};
string selectedGender = gender.Where(x => x.StartsWith(pm.gender)).FirstOrDefault();
ViewData["gender"] = new SelectList(gender, selectedGender);

そしてビューで:

<%: Html.Dropdownlist(x => x.Gender, ViewData["gender"], "Select") %>
于 2012-05-11T14:57:54.443 に答える