C# asp.net mvc 5 DropDownList可为null的int默认选项不为null
我对mvc DropDownList有一个问题,有很多关于它的话题,但没有一个有相同的问题 我想为我的DropDownList选择一个默认选项,但我还需要为“所有”项目选择附加选项 因此,我的控制器将默认值2绑定到下拉列表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
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)
- 无论类别选择“所有项目”,用户都可以更改为一次查看所有项目(这不起作用)
如何解决这个问题?问题不在于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,它将检查该值并尝试对此进行处理。