作成後に C# クラスの SelectList で選択した値を設定する方法がないと考えるのは正しいですか? それは少しばかげていませんか?
10 に答える
あなたはフレームワークと戦っていると思います。ビューに入るデータは、可能な最後の分 (LPM) に作成する必要があります。
このように考えると、aはHTML ヘルパーSelectList
をフィードするための型です。DropDownList
処理方法を決定する間、データを保存する場所ではありません。
より良い解決策は、データを に取得し、必要に応じて (s)List<T>
を初期化することです。このプラクティスの直接的な利点は、次のように複数の forSelectList
を再利用できることです。List<T>
DropDownList
Country of birth
Country of residence
これらSelectLists
はすべて、 type の Country リストを使用しますList<Country>
。
List<T>
この例のように、「直前」にyour を使用できます。
public class TaxCheatsFormViewModel
{
private List<Country> countries { get; set; }
public TaxCheat Cheat { get; private set; }
public SelectList CountryOfBirth { get; private set; }
public SelectList CountryOfResidence { get; private set; }
public SelectList CountryOfDomicile { get; private set; }
public TaxCheatsFormViewModel(TaxCheat baddie)
{
TaxCheat = baddie;
countries = TaxCheatRepository.GetList<Country>();
CountryOfBirth = new SelectList(countries, baddie.COB);
CountryOfResidence = new SelectList(countries, baddie.COR);
CountryOfDomicile = new SelectList(countries, baddie.COD);
}
}
ポイントは、List<T>
実際に出力する必要があるまでデータを保持する必要があるということです。可能な最後の分 (LPM)。
私はそれが古い質問であることを知っていますが、そこにいる誰かを助けるかもしれません. 私はエリックがしたことと非常によく似ていることをしました。既存のものから新しい SelectList を作成しました...
SelectList myList = GetMySelectList();
SelectListItem selected = myList.FirstOrDefault(x => x.Text.ToUpper().Contains("UNITED STATES"));
if (selected != null)
{
myList = new SelectList(myList, "value", "text", selected.Value);
}
これはGoogleで非常に高い結果であるため、ここで機能することがわかったものを提供します(年齢にもかかわらず):
厳密に型指定されたビュー (つまり、モデルに型が割り当てられている) を使用している場合、SelectList のコンストラクターに提供される SelectedValue は、ページのモデルに使用されるオブジェクトの値によって上書きされます。
これは編集ページではうまく機能しますが、特定の値を事前に選択したい場合の作成では機能しません。そのため、回避策の 1 つは、モデルとしてビューに渡すデフォルトの構築されたオブジェクトに正しい値を割り当てることです。例えば
var model = new SubjectViewModel()
{
Subject = new Subject(),
Types = data.SubjectTypes.ToList()
}
model.Subject.SubjectType = model.Types.FirstOrDefault(t => t.Id == typeId);
ViewData.Model = model;
return View();
したがって、私の作成ビューのコードは次のようになります。
Html.DropDownListFor(model => model.Subject.SubjectTypeId, new SelectList(model.Types, "Id", "Name"))
リストの SelectedValue として割り当てた値を含むドロップダウン リストを返します。
「SelectedValue」プロパティは読み取り専用です。コンストラクターで設定することが唯一の方法です。
Tor、SelectList は、ドロップダウン リストの作成に使用される ASP.NET MVC 構造です。あなたのやり方でもうまくいくはずですが、適切に行われれば、SelectListが(JSではなく)あなたのためにそれを行うはずです。
jQueryを使えばかなり簡単にできます。
$(function() {
$("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});
事前に選択されたドロップダウン値を使用して、編集可能なグリッドにドロップダウンが必要でした。私の知る限り、選択リストデータはコントローラーによってビューに提供されるため、ビューがそれを消費する前に作成されます。ビューが SelectList を使用したら、標準の DropDownList ヘルパーを使用するカスタム ヘルパーに渡します。したがって、かなり軽いソリューションです。執筆時点では、ASP.Net MVC の精神に適合していると思います。幸せでないときは、自分で巻いてください...
public static string DropDownListEx(この HtmlHelper ヘルパー、文字列名、SelectList selectList、オブジェクト selectedValue) { return helper.DropDownList(name, new SelectList(selectList.Items, selectList.DataValueField, selectList.DataTextField, selectedValue)); }
SelectList オブジェクトは、作成後は読み取り専用です。何かを選択したい場合は、次のようにします。
<%= Html.DropDownList("clientId", ViewData["clients"] as List<SelectListItem>,)%>
そしてコードビハインドで:
ViewData["clientId"] = "ASD"; //This should be the value of item you want to select
ViewData["clients"] = clientItemList; //List<SelectListItem>
ブラウザのクライアント側のことですか?
var select = document.getElementById('mySelect');
select.options[newIndex].selected = true;
単一のドロップダウンリストがある場合、通常はselectlistコンストラクターを使用して選択した値をロードする方が良いという@awrigleyなどに同意します。ただし、ページに n 個の同一のドロップダウンがある場合など、ビューで選択した値を設定する必要がある場合があります。コントローラーでこのようなコレクションを作成することは実用的ではなく、必要なドロップダウンの数が事前にわからない可能性があるため、ビューモデルで 1 つのインスタンスを選択された値セットのないテンプレートとして作成し、残りを動的に作成することをお勧めします。ビューで動的に。
子アイテムにドロップダウンが必要なときに、編集ビューで子アイテムのリストを反復処理するときに、これによく遭遇します。このような場合、1 行のコードで次のように実行できます。
@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect))