1

に変なものが見えますDropDownListFor。これは私のビューの一部です:

1:<dt>
2:  @Html.LabelFor(model => model.MainModel.DefaultAreaId)
3:</dt>
4:<dd>
5: @Html.DropDownListFor(model => model.MainModel.DefaultAreaId, Model.FKs["DefaultAreaId"].Items, new { @class = "Areadd" })
6: @Html.ValidationMessageFor(model => model.MainModel.DefaultAreaId, null, new { @class = "invalid-side-note" })
7:</dd>

コントローラーの最後の行をデバッグしてチェックインします。return View(model);Model.FKs["DefaultAreaId"].Itemsは次のとおりです。

 0: {Title="t1", value=13, Selected = false},
 1: {Title="t2", value=15, Selected = false},
 2: {Title="t3", value=17, Selected = false},
 3: {Title="t4", value=16, Selected = true}

また、上記のビューの2行目で確認すると、値は同じですが、値の後の5行目の正確に次のDropDownListForように変更します。

 0: {Title="t1", value=13, Selected = false},
 1: {Title="t2", value=15, Selected = false},
 2: {Title="t3", value=17, Selected = false},
 3: {Title="t4", value=16, Selected = false}

DropDownListForモデル値で何が起こるか理解できませんか? 私も同じビューで同じ方法を使用します:

11:<dt>
12:  @Html.LabelFor(model => model.MainModel.DefaultControllerId)
13:</dt>
14:<dd>
15: @Html.DropDownListFor(model => model.MainModel.DefaultControllerId, Model.FKs["DefaultControllerId"].Items, new { @class = "Controllerdd" })
16: @Html.ValidationMessageFor(model => model.MainModel.DefaultControllerId, null, new { @class = "invalid-side-note" })
17:</dd>

そして、すべて問題ありません。名前も変更しますがDefaultAreaId、何も変わりません。それで、これについて何か説明がありますか?ここで何が起こる?必要に応じて、View、Controller、および Model をすべてコピーできます。

アップデート

コントローラーで:

List<SelectListItem> Areas = new List<SelectListItem>();
Areas.Add(new SelectListItem { Text = "t1", Value = "13", Selected = false });
Areas.Add(new SelectListItem { Text = "t2", Value = "15", Selected = false });
Areas.Add(new SelectListItem { Text = "t3", Value = "17", Selected = false });
Areas.Add(new SelectListItem { Text = "t4", Value = "16", Selected = true });

Model.FKs.Add("DefaultAreaId", new ForeignKey { Title = "area", Items = Areas });

Fks:

public Dictionary<string, ForeignKey> FKs { get; set; }

そしてForeignKey、次のとおりです。

public class ForeignKey {
    public string Title { get; set; }
    public List<SelectListItem> Items { get; set; }
}
4

2 に答える 2

1

モデルをビューに送信する前に、コントローラーでデフォルト値を割り当てる必要があります。model.MainModel.DefaultAreaId

アップデート :


ただし、「私が想定するように:)」より良い方法は 次のとおりです:

public static IEnumerable<SelectListItem> SetSelected(this IEnumerable<SelectListItem> selectList, object selectedValue)
{
    selectList = selectList ?? new List<SelectListItem>();
    if (selectedValue == null)
        return selectList;
    var vlaue = selectedValue.ToString();
    return selectList.BuildList(m => m.Text, m => m.Value, null, m => String.Equals(m.Value, vlaue, StringComparison.CurrentCultureIgnoreCase));
}

BuildListヘルバーが必要な場合は、ここでSelectItemリストが必要なときにいつでも使用できます

public static IEnumerable<SelectListItem> BuildList<T>(IEnumerable<T> items, Func<T, string> text, Func<T, string> value = null, string optionalText = null, Func<T, bool> selected = null)
{
    var list = items.Select(x => new SelectListItem
                                     {
                                             Text = text.Invoke(x),
                                             Value = value == null
                                                             ? text.Invoke(x)
                                                             : value.Invoke(x),
                                             Selected = selected != null && selected.Invoke(x)
                                     }).ToList();
    if (optionalText != null)
        list.Insert(0, new SelectListItem() {Value = "", Text = optionalText});
    return list;
}

コントローラーでは何もせず、モデルに必要な値を設定します。

public ActionResult Edit(){
   var model = new YourModel();
   model.CategoryId = 4;
   //.. set the dropdownlist items in the ViewData or in your model in your case
   return View(model);
}

SetSelectedビューでは、通常どおり DropDownListFor を呼び出し、ヘルパー メソッドを呼び出すだけです。

@Html.DropDownListFor(model => model.CategoryId, ((IEnumerable<SelectListItem>)ViewData["Categories"]).SetSelected(model.CategoryId))

そして、それはあなたの例になります:

@Html.DropDownListFor(model => model.MainModel.DefaultAreaId, Model.FKs["DefaultAreaId"].Items.SetSelected(model.MainModel.DefaultAreaId))

コントローラーにデフォルト値を設定することを忘れないでください。

于 2012-06-10T10:05:00.480 に答える
0

SelectListを作成するときは、選択した値をそこに渡すか、選択リスト項目を介して割り当てますか。

var selectList = new SelectList([select list items], "[Key]", "[Value]", [SelectedValue]);
var selectList = new SelectList(list, "Id", "Name", 2);

ありがとう、

于 2012-06-09T16:17:17.740 に答える