asp.net-mvc-3 - 在 Post 上,下拉列表 SelectList.SelectedValue 为 null

标签 asp.net-mvc-3 razor drop-down-menu null selectedvalue

我的模型如下:

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 View (删除了不相关的部分)是:

@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 为 null。 (不过,可以从 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

问题 1:如何使用 SelectedValue 属性?

现在,如果在 Razor View 中将 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 
...

问题2:为什么?

谢谢。

最佳答案

MVC 将仅返回 POST 中所选选项的值,因此您需要一个属性来包含返回的单个值。

作为一个好建议,尝试通过 ViewBag 设置 SelectList,这有助于保持 ViewModel 中不含需要填充表单的数据。

所以你的例子可以这样解决:

public class testCreateModel
{
    public string s1 { get; set; }
    public int SelectedValue { get; set; }
}

并在您的 View 中执行以下操作:

@Html.DropDownList("SelectedValue", (SelectList)ViewBag.DL)

在 GET 操作中填充 ViewBag.DL 之前。

对于 Q2,默认的 ModelBinder 要求所有要绑定(bind)的类型都有一个默认的构造函数(以便 ModelBinder 可以创建它们)

关于asp.net-mvc-3 - 在 Post 上,下拉列表 SelectList.SelectedValue 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10116385/

相关文章:

asp.net-mvc-3 - 从 MVC3 中的 User.Identity.Name 中删除域

使用 MVC 4 的 Razor 智能感知和代码格式化

.net - 预选多选列表框中的项目 (MVC3 Razor)

javascript - 是否可以将 Razor 文件中的模型扩展为单独的 Javascript 文件?

javascript - 如何通过单击页面中的其他位置取消下拉列表 - stopPropagation?

css - 我的 CSS 导航中的下拉菜单没有显示在正确的位置

javascript - 根据搜索文本框显示/隐藏行

c# - 当 url 末尾有 DOT (.) 时,Asp.Net MVC 路由操作方法不会调用

html - HTML 呈现的 MVC3 TextArea 问题

.net - Caliburn.Micro:绑定(bind)到列表,第一项为空