web-dev-qa-db-ja.com

インスタンス化後にSelectListで選択した値を設定する

選択した値を作成した後、C#クラスのSelectListに設定する方法はないと思いますか?それは少しばかげていませんか?

31
Boris Callens

あなたはフレームワークと戦っていると思います。ビューに送られるデータは、LPMで作成する必要があります。

このように考えると、SelectListDropDownList HTMLヘルパーにフィードするタイプです。処理方法を決定する間、データを保存する場所ではありません。

より良い解決策は、データをList<T>に取得し、必要に応じてSelectList(s)を初期化することです。このプラクティスの直接の利点は、次のように、List<T>を複数のDropDownListに再利用できることです。

Country of birth
Country of residence

これらのSelectListsはすべて、タイプList<Country>の国リストを使用します。

この例のように、「ギリギリ」でList<T>を使用できます。

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)。

19
awrigley

私はそれが古い質問であることを知っていますが、そこにいる誰かを助けるかもしれません。私はエリックと同じように見えることをしました。既存のSelectListから新しい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);
}
4
JoeSharp

これは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として割り当てた値を持つドロップダウンリストを返します。

4
eudaimos

「SelectedValue」プロパティは読み取り専用です。コンストラクタで設定するのが唯一の方法です。

Tor、SelectListは、ドロップダウンリストの作成に使用されるASP.NET MVC構造です。それをあなたのやり方で行うこともうまくいくはずですが、適切に行われた場合、SelectListはあなたのために(JSではなく)それを行うはずです。

3
GalacticCowboy

これはコントローラーでできると思います。名前/ ID StateCodeを使用してドロップダウンリストをレンダリングする場合は、SelectListの作成後に、このコードを使用して選択状態を設定できます。

ViewData ["StateCode"] = "VT";

ドロップダウンリストのHTMLヘルパーが、作成中のドロップダウンリストと同じ名前のViewDataアイテムを探しているようです。

このテクニックを使うのは好きではないと思いますが、うまくいくようです。

現在、SelectListクラスは少し弱いことに同意します。 SelectListを作成して、後で値またはテキストのいずれかで値を選択できるようにしたいと思います。

1
Ben Mills

@awrigleyやその他の人には同意しますが、ドロップダウンリストが1つしかない場合は、通常、selectlistコンストラクターを使用して選択した値をロードする方が良いと思います。ただし、n個の同一のドロップダウンがあるページがある場合など、ビューで選択した値を設定する必要がある場合があります。コントローラでそのようなコレクションを作成することは実用的ではなく、必要なドロップダウンの数が事前にわからないこともあるため、より良いアプローチは、選択された値が設定されていないテンプレートとしてビューモデルに1つのインスタンスを作成し、残りを動的に作成することですビューで動的に。

子がドロップダウンを必要とするときに、編集ビューで子項目のリストを繰り返し処理するときに、これによく遭遇します。そのような場合、1行のコードで次のように行うことができます。

@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect))
0
spadelives

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>
0
linh1987

あなたはブラウザでクライアント側を意味しますか?

var select = document.getElementById('mySelect');
select.options[newIndex].selected = true;
0
Tor Haugen

自分で編集可能なグリッドにドロップダウン値が事前に選択されたドロップダウンが必要でした。 Afaik、選択リストデータはコントローラーによってビューに提供されるため、ビューがデータを使用する前に作成されます。ビューがSelectListを消費したら、標準のDropDownListヘルパーを使用するカスタムヘルパーに渡します。したがって、かなり軽量なソリューションimoです。執筆時点ではASP.Net MVCの精神に適合していると思います。幸せでないときは自分で転がしてください...

public static string DropDownListEx(this HtmlHelper helper、string name、SelectList selectList、object selectedValue)
 {
 return helper.DropDownList(name、new SelectList(selectList.Items、selectList.DataValueField、selectList.DataTextField 、selectedValue)); 
} 
0
Erik Lenaerts

JQueryを使用すると、これはかなり簡単にできます。

$(function() {
    $("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});
0
CmdrTallen