asp.net-mvc-3 – DropDownListFor中的ViewBag属性值,而不是Mode
发布时间:2020-12-15 20:56:18 所属栏目:asp.Net 来源:网络整理
导读:我们在DropDownListFor(ASP.NET MVC3版本)中发现了奇怪的行为.它在下拉列表中选择ViewBag属性值而不是Model属性值. 模型: public class Country { public string Name { get; set; }}public class User { public Country Country { get; set; }} 控制器索引
我们在DropDownListFor(ASP.NET MVC3版本)中发现了奇怪的行为.它在下拉列表中选择ViewBag属性值而不是Model属性值.
模型: public class Country { public string Name { get; set; } } public class User { public Country Country { get; set; } } 控制器索引动作: ViewBag.CountryList = new List<Country> { /* Dropdown collection */ new Country() { Name = "Danmark" },new Country() { Name = "Russia" } }; var user = new User(); user.Country = new Country(){Name = "Russia"}; /* User value */ ViewBag.Country = new Country() { Name = "Danmark" }; /* It affects user */ return View(user); 视图: @Html.EditorFor(user => user.Country.Name) @Html.DropDownListFor(user => user.Country.Name,new SelectList(ViewBag.CountryList,"Name",Model.Country),"...") 它将显示带有“俄罗斯”值的文本框和带有“Danmark”值的下拉列表,而不是“俄罗斯”. 我没有找到任何关于此行为的文档.这种行为是否正常?为什么这是正常的?因为很难控制ViewBag和Model属性名称. This sample MVC3 project sources 解决方法
我不太确定为什么做出这个决定,但是之所以发生这种情况是因为MVC框架在使用参数提供的值之前尝试使用ViewData提供的值.这就是ViewBag.Country覆盖参数提供的值Model.Country的原因.
这就是私有方法SelectInternal在MVC框架中的written. object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName,typeof(string[])) : htmlHelper.GetModelStateValue(fullName,typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (!usedViewData) { if (defaultValue == null) { defaultValue = htmlHelper.ViewData.Eval(fullName); } } if (defaultValue != null) { IEnumerable defaultValues = (allowMultiple) ? defaultValue as IEnumerable : new[] { defaultValue }; IEnumerable<string> values = from object value in defaultValues select Convert.ToString(value,CultureInfo.CurrentCulture); HashSet<string> selectedValues = new HashSet<string>(values,StringComparer.OrdinalIgnoreCase); List<SelectListItem> newSelectList = new List<SelectListItem>(); foreach (SelectListItem item in selectList) { item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); newSelectList.Add(item); } selectList = newSelectList; } 此代码defaultValue = htmlHelper.ViewData.Eval(fullName);试图从ViewData获取值,如果它可以获取值,它将覆盖提供的参数selectList with new list. 希望它可以提供帮助.谢谢. side-node:ViewBag只是??ViewData的动态包装类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – OwinStartup没有开始…为什么?
- ASP.NET MVC 3的jquery ajax表单
- ASP.Net相当于PHP的file_get_contents(‘php:// input’);
- asp.net-mvc – 如何使用npoi将图像放在一个单元格中
- asp.net-mvc – 动态加载部分视图
- asp.net-mvc – CSS / Javascript缩小和捆绑在MVC中究竟是如
- asp.net-mvc – MVC Ajax.Beginform OnComplete / OnSucces
- asp.net-mvc – 在asp.net和ravendb中处理基于活动的feed的
- asp.net-mvc – 如何检测移动浏览器,并将适当的内容指向它?
- 使用ASP.NET Core2.2创建WebApp
推荐文章
站长推荐
- asp.net – 使用SQLBulkCopy插入/更新数据库
- asp.net-web-api – 在Visual Studio中启动WebAP
- 您的登录尝试未成功.请再试一次.在asp.net虽然密
- 如何在ASP.Net WebControl的“Content”内部属性
- asp.net-mvc – 无Cookie会话和跨站点表单帖子
- asp.net – 如何使用Log4Net启用IP地址记录
- asp-classic – 在Classic ASP中的应用程序范围中
- C#正则表达式_简单梳理_Emoji表情字符处理
- asp.net-mvc – Jquery AJAX成功没有被Coded UI测
- asp.net – 控制器!=业务层?
热点阅读