2

ASP.Net MVC コードのバグを調べるように依頼されましたが、(私にとって) SelectList に非常に奇妙な問題があります。

項目を生成するコントローラーからのコード (SelectList を返すメソッド、合計 5 つあります)。その後、各 SelectList は ViewData コレクションに保存されます。

List<SelectListItem> items = new List<SelectListItem>();
string yesText = "Yes";
string noText = "No";
if (ci.LCID.Equals((int)LanguageCodes.FRANCE))
{
    yesText = "Oui";
    noText = "Non";
}

SelectListItem yesItem = new SelectListItem();
yesItem.Text = yesText;
yesItem.Value = ((int)MarketingBy.Yes).ToString();
yesItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(yesItem.Value));

SelectListItem noItem = new SelectListItem();
noItem.Text = noText;
noItem.Value = ((int)MarketingBy.No).ToString();
noItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(noItem.Value));

items.Add(yesItem);
items.Add(noItem);

return new SelectList(items, "Value", "Text", yesItem.Selected ? yesItem.Value : noItem.Value);

作成時点での簡単な「クイックウォッチ」は、すべて問題がないことを示しています。 生成された選択リスト

ビューがレンダリングされている時点では、値はまだ正常に見えます。ただし、ビューが読み込まれると、リストの最初の項目が常に選択されます。生成される HTML は次のとおりです。

<tr>
<td>Fax</td>
<td>
    <select id="MarketingByFax" name="MarketingByFax">
        <option value="134300002">Yes</option>
        <option value="134300001">No</option>
    </select>
</td>
</tr>

(明確にするために他の値は省略されています)。

何か案は?それとも研究の道?著者は、これが「先週まで」機能していたことを断言しています (どちらの方法もわかりません)。

編集:ビューのコード -

<td><%: Html.DropDownList("MarketingByFax", (SelectList)ViewData["MarketingByFaxList"])%></td>
4

2 に答える 2

5

このコードは、考えられるすべての面でひどいように見えます(もちろんIMHO)。なぜそれが機能しないのか分かりませんし、知りたくありません。私にできることは、それを改善する方法を提案することだけです(したがって、私にはおかしな考えがないので、コードが機能しない理由についての解決策を探している場合は、この投稿を読むのをやめることができます)。

したがって、最初の改善は、すべてを取り除きViewData、ビューモデルを導入することです。

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

次に、このビューモデルにデータを入力するコントローラーアクションがあります。

public ActionResult Index()
{
    var model = new MyViewModel
    {
        // I want to preselect the second value
        SelectedValue = "No",
        Items = new[]
        {
            new SelectListItem { Value = "Yes", Text = "yeap !" },
            new SelectListItem { Value = "No", Text = "nope !" },
        }
    };
    return View(model);
}

強く型付けされたビューでは、ヘルパーをビューモデルにバインドするだけです。

<%= Html.DropDownListFor(
    x => x.SelectedValue,
    new SelectList(Model.Items, "Value", "Text")
) %>

また、いくつかの列挙型を操作する場合は、次の拡張方法が役立つ場合があります。

それがどれほど簡単か分かりますか?で醜いキャストをViewDataする必要はもうありません。リストを定義したり、複雑な条件を指定したりする必要もありません。...

備考:繰り返しになりますが、これらは私の2セントです。必要に応じて戦闘を続けることができViewDataます。

于 2011-06-15T19:34:29.450 に答える
0

あなたが試すことができます

<%: Html.DropDownList("MarketingByFax", (IEnumerable<SelectListItem>)ViewData["MarketingByFaxList"])%>

dropdwonには、Selectlistタイプのオブジェクトの列挙を受け入れるオーバーロードがあり、リスト内のselectListItemsのSelectedプロパティに応じてリストの値を自動的に設定します。このためにあなたは設定する必要があります

ViewData["MarketingByFaxList"] = items;//where item is IEnumerable<SelectListItem> or List<SelectListItem> as you used in your code
于 2011-06-15T19:27:52.080 に答える