DropDownListFor在回发时始终为空

时间:2015-02-08 17:24:47

标签: c# asp.net .net asp.net-mvc razor

我拉着我的头发试图让下拉列表在我的Razor Views中工作,我找不到有效的解决方案,我只能假设我错过了一些明显的东西..

我正在尝试创建一个注册页面,其中包含用于学生个人详细信息的表单,该表单使用文本框(正常工作)和下拉列表从查找表中选择项目,并将密钥作为外键插入我的新记录中。所以,我的学生有一个头衔 - 我用所有的Salutations&来自我的数据库的ID,允许用户选择一个,然后将我的新学生记录保存在发回控制器上。下拉列表填充正常,值都在那里,用户可以选择一个值,但在回发时它总是为空???

以下给出的示例仅涉及我的模型中的一个这样的字段,有很多。在尝试使其工作时,我使用所有文本框只有一个下拉列表,因此问题出现在某处,而不是隐藏在其他代码中。

我的模型(ViewCandidate)(以及其他字段):

public int SalutationID {get; set;}//foreign key to be saved when I pass the values from my View object to a domain entity object
public Dictionary<int, string> Salutations {get; set;} //key/value pairs to fill the dropdown in the view

当我在控制器中创建模型时,我会填充下拉列表:

public ViewResult Link()
{    
    return View(new ViewCandidate{ Salutations = GetSalutations(entities) }); //'entities' is my Entity Framework context, all the entities in my data model/database
}

public static Dictionary<int, string> GetSalutations(DBEntities entities)
{
    Dictionary<int, string> dictionary = new Dictionary<int, string>();
    foreach(var s in entities.Salutations)
    {
        dictionary.Add(s.SalutationID, s.Salutation);
    }
    return dictionary;
}

在我的Razor View中,我正在使用模型绑定:

@model ViewModels.ViewCandidate
...

<div class="align-center">
        <label>Title</label>
        @Html.DropDownListFor(x => x.SalutationID, new SelectList(Model.Salutations, "Key", "Value"), "Please select your title", new { @class="form-control"})
    </div>

当我运行应用程序并导航到Link Controller页面时,这是为下拉列表生成的html:

<div class="align-center">
<label>Title</label>
<select class="form-control" data-val="true" data-val-number="The field SalutationID must be a number." data-val-required="The SalutationID field is required." id="SalutationID" name="SalutationID"><option value="">Please select your title</option>
<option value="1">Mr</option>
<option value="2">Mrs</option>
<option value="3">Miss</option>
<option value="4">Ms</option>
<option value="5">Master</option>
<option value="6">Doctor</option>
</select>
</div>

使用正确的值生成下拉列表。但是,当我完成表单的其余部分并提交回发后,我将被带回Visual Studio(Razor View中的行):

 @Html.DropDownListFor(x => x.SalutationID, new SelectList(Model.Salutations, "Key", "Value"), "Please select your title", new { @class="form-control"})

出现以下错误:

  

类型&#39; System.ArgumentNullException&#39;的异常发生在System.Web.Mvc.dll中但未在用户代码中处理

     

值不能为空。

     

参数名称:项目

&#39;项目&#39;是SelectList构造函数中IEnumerable的参数名称,它具有项目并完全呈现它们。我的数据库中的任何称呼记录或视图中呈现的都不是NULL。我不能让这个工作,它让我发疯,任何人都可以帮忙??

如果它有任何区别我正在使用实体框架 - 所以我最终保存的实体是&#39; Candidate&#39;我从视图中创建的ViewCandidate传递值。我迭代创建Dictionary<int, string>的Saluations是EF对象。在View Objects中包装它们也没有任何帮助。

2 个答案:

答案 0 :(得分:0)

ViewModel中的

SalutationID是变量,而不是属性。尝试将其更改为:

public int SalutationID {get; set;}

似乎变量无法发布到控制器。

答案 1 :(得分:0)

ModelSalutations的值在回发后是否为空?如果是这样,SelectList构造函数将抛出异常。表单中的提交仅回发与包含数据值的表单元素相对应的数据。但是,这不包括选择选项值。

我有类似的问题。事实证明我在控制器HttpGet方法中填充了我的Model.Salutations版本,但在HttpPost中却没有。你可以尝试在你的HttpPost方法的末尾添加这样的东西:

model.Salutations = GetSalutations(entities);
return this.View(model);

希望有所帮助。