我的模型如下:
public class testCreateModel
{
    public string s1 { get; set; }
    public SelectList DL { get; set; }
    public testCreateModel()
    {
        Dictionary<string, string> items = new Dictionary<string, string>();
        items.Add("1", "Item 1");
        items.Add("2", "Item 2");
        DL = new SelectList(items, "Key", "Value");
    }
}
我的发起行动是:
    public ActionResult testCreate()
    {
        testCreateModel model = new testCreateModel();
        return View(model);
    }
我的 Razor 视图(删除了无关部分)是:
@model Tasks.Models.testCreateModel
@using (Html.BeginForm()) {
<fieldset>
    <legend>testCreateModel</legend>
    <div class="editor-label">
        @Html.LabelFor(model => model.s1)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.s1)
    </div>
    <div class="editor-label">
        Select an item:
    </div>
    <div class="editor-field">
        @Html.DropDownList("dropdownlist", (SelectList)Model.DL)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}
回发动作是:
    public ActionResult testCreate(testCreateModel model, FormCollection collection)
    {
        if (ModelState.IsValid)
        {
            Console.WriteLine("SelectedValue: ",model.DL.SelectedValue);
            Console.WriteLine("FormCollection:", collection["dropdownlist"]);
            // update database here...
        }
        return View(model);
    }
在回发时,model.DL.SelectedValue 为空。(但是,可以从 FormCollection 中获取所选项目,但这不是重点)。否则,DL 对象仍会正确填充,立即窗口输出如下:
model.DL
{System.Web.Mvc.SelectList}
    base {System.Web.Mvc.MultiSelectList}: {System.Web.Mvc.SelectList}
    SelectedValue: null
model.DL.Items
Count = 2
    [0]: {[1, Item 1]}
    [1]: {[2, Item 2]}
model.DL.SelectedValue
null
Q1:如何改用 SelectedValue 属性?
现在,如果在 Razor 视图中我将 Html SELECT 标记的名称更改为 DL(即与模型中的属性名称相同):
@Html.DropDownList("DL", (SelectList)Model.DL)
我得到一个例外:
No parameterless constructor defined for this object. 
Stack Trace: 
[MissingMethodException: No parameterless constructor defined for this object.]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +199
System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext, ModelBindingContext bindingContext, ValueProviderResult 
...
Q2:为什么?
谢谢。