17

ASP.NET MVC を使い始めたばかりで、次のような状況に遭遇しました。バグのように感じますが、そうでない場合は、説明をいただければ幸いです:)

ビューにはかなり基本的なものが含まれています

<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>

モデルを使用していない場合、値と選択された項目は期待どおりに設定されます。

//works fine
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  ViewData["MyList"] = "XXX"; //set the selected item to be the one with value 'XXX'
  ViewData["MyTextBox"] = "ABC"; //sets textbox value to 'ABC'

  return View();
}

しかし、モデルを介してロードしようとすると、テキストボックスには期待どおりに値が設定されていますが、ドロップダウンには選択されたアイテムセットがありません。

//doesnt work
public ActionResult MyAction(){
  ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"}

  var model = new {
    MyList = "XXX", //set the selected item to be the one with value 'XXX'
    MyTextBox = "ABC" //sets textbox value to 'ABC'
  }

  return View(model);
}

何か案は?私の現在の考えでは、おそらくモデルを使用する場合、ビューデータを使用して (正常に動作します)、選択リストをモデルに渡すのではなく、SelectList コンストラクターで選択した項目を設定することに制限されている可能性があります。これには利点があります。コードを少しきれいにする - なぜこの方法が機能しないのか疑問に思っています....

提案に感謝します

4

7 に答える 7

23

実際には、を渡す必要がnullありHtml.DropDownList()ます。
私はまったく同じ問題を抱えていて、Reflectorを使用してMVCソースコードを調べました。

System.Web.Mvc.Extensions.SelectExtensionsクラスのSelectInternal()メソッドでは、selectListパラメーターがnullかどうかをチェックます。として渡された場合は、正しくnull検索されます。SelectList

これが「コードビハインド」です。

ViewData["MyDropDown"] = new SelectList(selectListItems,
                             "Value",
                             "Text",
                             selectedValue.ToString()
                         );

これがHTMLビューコードです。

<%= Html.DropDownList("MyDropDown", null,
        "** Please Select **",
        new { @class = "my-select-css-class" }
    ) %>

注:ASP.NET MVC 2.0(ベータ版)を使用しています。

更新メモ:2012年1月31日

過去3年間ASP.NETMVCを広範囲に使用した後、私additionalViewDataはこのHtml.EditorFor()方法からより多くを使用することを好みます。

モデルのプロパティと同じプロパティ名を持つオブジェクトとして[リストアイテム]をメソッド に渡します。anonymousHtml.EditorFor()

<%= Html.EditorFor(
    m => m.MyPropertyName,
    new { MyPropertyName = Model.ListItemsForMyPropertyName }
) %>

詳細が必要な場合は、こちらの別のスレッドで私の回答を参照してください。

于 2009-11-24T01:51:02.803 に答える
5

たくさんのヘミングとホーイングの後、それは次のコード行に要約されます

if (ViewData.ModelState.TryGetValue(key, out modelState))

これは、MVCがViewData Dictionary <>オブジェクトのみを確認し、ViewData.Modelオブジェクトをトラバースしないことで値を解決しようとしていることを意味します。

それがバグなのか、制限なのか、設計上の決定なのかはわかりません。ただし、次の方法で修正できます。

<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>
于 2008-12-23T23:13:24.093 に答える
2

私は明らかにここに遅れています。しかし、他の誰かがこの問題に遭遇した場合に備えて、このコメントを追加したいと思いました。

MVC 2では、次のようにしてアイテムを選択できます...

public ActionResult Edit(int id)
        {
            Team team = _db.TeamSet.First(m => m.TeamID == id);
            var fanYear = from c in _db.FanYearSet select c;
            ViewData["FantasyYear"] = new SelectList(fanYear, "YearID", "FantasyYear", team.FanYearReference.EntityKey.EntityKeyValues[0].Value);
            var league = from c in _db.LeagueSet select c;
            ViewData["League"] = new SelectList(league, "LeagueID", "League_Name", team.LeaguesReference.EntityKey.EntityKeyValues[0].Value);

            return View(team);
        }

4番目のパラメーターは値を取り、ドロップダウンリストで必要な値を選択します。私の例では、teamというテーブルがあり、fanYearとleagueというテーブルに関係が設定されています。

私が編集しているチームを最初に取得し、次にファンタジー年のドロップダウンリストとリーグ用のドロップダウンリストを作成していることがわかります。チームの年とリーグを決定するために、エンティティ参照を使用する必要がありました。

ただそれをそこに出したかったのです。これを行う例は見つかりませんでした。

于 2010-12-11T16:49:16.953 に答える
2

SelectList コレクションを作成するときに、コントローラ アクションで選択した値を設定してみてください。

ViewData["AddressTypeId"] = new SelectList(CustomerService.AddressType_List(), "AddressTypeId", "Name", myItem.AddressTypeId );

于 2009-03-25T14:32:44.957 に答える
-1

無効またはnullのViewDataに問題がある場合は、コントローラーのアクションに注意してください。

MyListというHtml.DropDownlistのMyListというViewDataがあるとします。

電話をかけるModelState.AddModelError("MyList","Please select the profession")と、ViewDataリストのコンテンツがこの警告テキストに置き換えられます。

インターネットの周りの人々がDropDownListのViewDataでnullの問題を抱えているのもそのためです。

肝心なのは、エラーモデルのIDに注意してください。IDがHTMLコントロールに干渉してはなりません。

于 2010-04-09T21:11:35.210 に答える
-1

このスレッドから何かが欠けている可能性がありますが、C# では次のように機能します。

Html.DropDownList("ProfessionGuid", (SelectList)ViewData["Professions"])

' ProfessionGuid' は、リストで選択する値です。

VB.Net では、次のようになると思います。

Html.DropDownList("ProfessionGuid", ViewData["Professions"] AS SelectList)
于 2009-10-27T12:05:25.063 に答える
-1

これに関する私の懸念は、リストを 1 つのフィールドにしか使用できないことです。複数のユーザー フィールドを持つエンティティがあるため、次を使用します。

< %= Html.DropDownList("fieldAAA", 
                       new SelectList( (IEnumerable) ViewData["Users"], "Value", "Text", fieldAAA))

%> 
于 2010-09-15T20:42:16.670 に答える