2

私のビューにはこのドロップダウンリストがあり、MVC4Webアプリケーションのモデルに接続しようとしています。

モデルオブジェクトのプロパティは次のとおりです。

    /// <summary>
    /// Used to provide values in the type drop down list in.
    /// </summary>
    public IEnumerable<SelectListItem> SomeTypes
    {
        get
        {
            var someTypeNames = new [] { "abc", "def", "xyz" };

            var someTypes = Enum.GetValues(typeof(ESomeType)).Cast<EsomeType>();
            var someTypesSelectItemsList = new List<SelectListItem>();
            someTypesSelectItemsList.Add(new SelectListItem()
            {
                Selected = true,
                Text = "Choose a type",
                Value = "-1"
            });
            foreach (var eSomeType in someTypes)
            {
                var sli = new SelectListItem()
                {
                    Selected = false,
                    Text = someTypeNames[(int)eSomeType],
                    Value = ((int)eSomeType).ToString()
                };
                someTypesSelectItemsList.Add(sli);
            }
            return someTypesSelectItemsList;
        }
        set { }
    }

これは、後でビューでドロップダウンをバインドするモデルプロパティです。

[DataMember, Required]
[Display(Name = "Type:")]
public virtual int SomeType { get; set; }

次に、これを自分のビューに印刷します。

@Html.LabelFor(m => m.SomeType)
@Html.DropDownListFor(m => m.SomeType, new SelectList(Model.SomeTypes, "Value", "Text"), new { ng_model = "type", ng_change = "ChangeType()" })
@Html.ValidationMessageFor(m => m.SomeType)

これですべて正常に機能しますが(後でリファクタリングします)、私の問題はレンダリングされたhtmlにあります。

<label for="SomeType">Type:</label>
<select data-val="true" data-val-number="The field Type: must be a number." data-val-required="The Type: field is required." id="SomeType" name="SomeType" ng-change="ChangeType()" ng-model="type">
    <option value="-1">Choose a type</option>
    <option selected="selected" value="0">abc</option>
    <option value="1">def</option>
    <option value="2">xyz</option>
</select>
<span class="field-validation-valid" data-valmsg-for="SomeTypeType" data-valmsg-replace="true"></span>

ご覧のとおり、「abc」オプションは「choose a type」オプションではなく、selected = "selected"であり、モデルのコードが適切なオプションをselectedに設定していることがはっきりとわかります。何が起きてる?

助けてくれてありがとう!!

4

1 に答える 1

2

この問題は、モデルバインディング変数の名前が選択リストと同じである場合に発生します。

名前SelectListSomeTypesListに変更してみてください

あなたのモデルでは:

public IEnumerable<SelectListItem> SomeTypesList

そしてあなたの見解では:

@Html.DropDownListFor(m => m.SomeType, 
                      new SelectList(Model.SomeTypesList, "Value", "Text"),
                      new { ng_model = "type", ng_change = "ChangeType()" },
                      "Choose a type"}

フォローアップメモ:ヘルパーではなく、選択リストにデフォルト値を設定しています

于 2013-02-22T23:12:18.553 に答える