【问题标题】:asp.net mvc 5 DropDownList nullable int default option not nullasp.net mvc 5 DropDownList 可为空的 int 默认选项不为空
【发布时间】:2014-02-09 19:22:46
【问题描述】:

我有一个关于 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);

property_types

  public static Dictionary<string, int> property_types = new Dictionary<string, int>() { 
    { "House", 1 }, { "Flat", 2 }, { "Garden", 3 }

所以它应该像这样工作

  • 第一次输入时默认选择值为2,等于“flat”,只显示“flat”项(有效)
  • 用户可以将其更改为列表中的其他选项(作品)
  • 无论选择“所有项目”的类别如何,用户都可以更改为一次查看所有项目(这不起作用)

我认为它应该可以工作,但令我惊讶的是,当我选择“所有项目”时,mvc 不返回 null 它只是返回默认的 int 值 2,所以基本上没有办法查询所有项目。

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

如何解决这个问题?

【问题讨论】:

    标签: c# .net asp.net-mvc drop-down-menu nullable


    【解决方案1】:

    问题不在于null 不是由POST 返回,而是null 是由POST 返回。

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

    public ActionResult Index(int? All = 2)
    

    您希望如何区分“所有项目”和应用程序的默认行为。在这种情况下,默认行为是仅显示 flats

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

    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 From POSTback 表示“所有项目”,而最初的null 表示“采用默认值”。如果您将 = 2 删除到您的操作中。那么你之前的代码就可以了,但是默认值是“All items”而不是“Flat”
    • 是的,这是一个 MVC 问题。如果我不提供任何值,这意味着没有发送表单 POST“All”字段,它应该是 2,但是如果我选择“All items”,则发送值为空的表单 POST 字段“All”,控制器应该得到一个那么空值。这不是双重含义的问题,这是mvc在请求中没有POST字段和POST字段但具有空值之间无法识别的问题,这是两个不同的东西。事实上,它应该以最直观的方式工作,就像我在问题中展示的那样简单,不需要变通方法,但它不会。
    • 如果您查看 DefaultModelBinder,您会看到收到的值是 null。是 .Net 框架将 null 更改为 2
    • 会检查并尝试做一些事情。
    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 2011-05-01
    • 2012-01-26
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多