C# asp.net mvc 5 DropDownList可为null的int默认选项不为null

C# asp.net mvc 5 DropDownList可为null的int默认选项不为null,c#,.net,asp.net-mvc,drop-down-menu,nullable,C#,.net,Asp.net Mvc,Drop Down Menu,Nullable,我对mvc DropDownList有一个问题,有很多关于它的话题,但没有一个有相同的问题 我想为我的DropDownList选择一个默认选项,但我还需要为“所有”项目选择附加选项 因此,我的控制器将默认值2绑定到下拉列表 public ActionResult Index(int? All = 2){ ... 在cshtml中,我有 @Html.DropDownList("All","All items") 所有列表都是这样填写的 ViewData["All"] = new Sele

我对mvc DropDownList有一个问题,有很多关于它的话题,但没有一个有相同的问题

我想为我的DropDownList选择一个默认选项,但我还需要为“所有”项目选择附加选项

因此,我的控制器将默认值2绑定到下拉列表

 public ActionResult Index(int? All = 2){ ...
在cshtml中,我有

 @Html.DropDownList("All","All items")
所有列表都是这样填写的

 ViewData["All"] = new SelectList(CommonLists.property_types.Select(x => new { v = x.Value, t = x.Key.ToLower() }), "v", "t", All);
属性类型

  public static Dictionary<string, int> property_types = new Dictionary<string, int>() { 
    { "House", 1 }, { "Flat", 2 }, { "Garden", 3 }
publicstaticdictionary属性\u types=newdictionary(){
{“房子”,1},{“公寓”,2},{“花园”,3}
所以它应该是这样工作的

 ViewData["All"] = new SelectList(CommonLists.property_types.Select(x => new { v = x.Value, t = x.Key.ToLower() }), "v", "t", All);
  • 首次输入时,默认选择值为2,等于“展开”,仅显示“展开”项目(工作)
  • 用户可以从列表中将其更改为其他选项(works)
  • 无论类别选择“所有项目”,用户都可以更改为一次查看所有项目(这不起作用)
我假设它应该可以工作,但令我惊讶的是,当我选择“所有项目”时,mvc不会返回null,它只返回默认的int值2,因此基本上无法查询所有项目

这个假设是这样的吗?自动生成的“所有项”是空值,所以我假设mvc会将其转换为null,但事实并非如此


如何解决这个问题?

问题不在于POST没有返回
null
,而是POST返回了
null

由于您的操作的默认值为2。当操作接收到
null
时,它将使用默认值初始化变量,在这种情况下,2

public ActionResult Index(int? All = 2)
你想要做的是能够区分“所有项目”和应用程序的默认行为。在这种情况下,默认行为是只显示平面

您可以通过在控制器内部构建“所有项”来实现该目标

public ActionResult Index(int? All = 2)
{
    var propertyTypesSelectList = new SelectList(property_types.Select(x => new {v = x.Value, t = x.Key.ToLower()}), "v", "t", All).ToList();
    propertyTypesSelectList.Insert(0, new SelectListItem() { Value = "0", Text = "All items"});

    ViewData["All"] = propertyTypesSelectList;
    return View();
}
改变你对这个的看法

@Html.DropDownList("All") 

我怀疑会是这种情况,MVC在这方面应该更智能,如果他们提供了一个添加默认选项的选项,如果它有空值,而不是我的默认值2,它应该返回null,特别是如果它是可空int。也许使用自定义参数绑定器修复它是个好主意,我会看到。这不是MVC的问题。你是赋予空值双重含义。回发的
null
表示“所有项目”,而初始的
null
表示“采用默认值”。如果将
=2
删除到操作中,则先前的代码将起作用,但默认值为“所有项目”,而不是“平坦”是的,这是一个MVC问题。如果我没有提供任何值,这意味着没有表单POST“All”字段被发送,它应该是2,但是如果我选择“All items”一个表单POST字段“All”如果发送的值为空,那么控制器应该得到一个空值。这不是一个双重意义的问题,这是一个mvc无法识别请求中没有POST字段和POST字段之间的问题,但如果值为空,这是两件不同的事情。事实上,它应该以最直观的方式工作,就像我在问题中所展示的一样简单,不需要任何解决方法,但它不会。如果查看DefaultModelBinder,您将看到收到的值是
null
。是.Net framework将该null“更改”为2,它将检查该值并尝试对此进行处理。