Asp.net 如何通过@Html.DropDownListFor正确设置所选状态

Asp.net 如何通过@Html.DropDownListFor正确设置所选状态,asp.net,asp.net-mvc,asp.net-mvc-3,razor,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Razor,Asp.net Mvc 4,我的视图中有一个下拉列表,我正试图连接到MVC4 web应用程序中的模型 以下是我的模型对象的属性: /// <summary> /// Used to provide values in the type drop down list in. /// </summary> public IEnumerable<SelectListItem> SomeTypes { get {

我的视图中有一个下拉列表,我正试图连接到MVC4 web应用程序中的模型

以下是我的模型对象的属性:

    /// <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
def
xyz
如您所见,“abc”选项是selected=“selected”而不是我的“chooseatype”选项,我们可以清楚地看到我的模型中的代码将正确的设置为selected。这是怎么回事


谢谢你的帮助

当模型绑定变量与选择列表具有相同名称时,会发生此问题

尝试将
选择列表的名称更改为SomeTypesList

在您的模型中

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"}


后续说明:您在选择列表中设置的是默认值,而不是您的助手

它似乎无法解决我的问题。我将编辑我的问题并添加要绑定到的模型属性。是的,它们的名称不同。一个单数,一个复数,一个表示“选择值”,另一个表示可能值。提到你所说的话,我已经越过了其他问题,但这似乎不适用于我的情况。我肯定这是件很愚蠢的事,我只是不想…@sébastienRicher,我想我明白了。您似乎试图在选择列表中而不是在助手中设置默认值。请看我如何设置默认值的示例。添加“选择类型”作为帮助器的最后一个参数,并从选择列表中删除。这两个都很重要。如果我做了这些更改,就会出现编译错误。我可以将我的“选择类型”文本作为第三个参数,将我的“属性”对象作为第四个参数,然后运行。尽管如此,问题仍然存在,仍然选择了“abc”。作为参考,我尝试了以下方法:“@Html.DropDownListFor(m=>m.SomeType,Model.SomeTypesList,“选择一个类型”,new{ng_Model=“type”,ng_change=“ChangeType()”),得到了相同的结果。“abc”是所选的一个。