gpt4 book ai didi

asp.net-mvc-3 - DropDownListFor 中的 ViewBag 属性值,而不是 Model 属性值

转载 作者:行者123 更新时间:2023-12-04 14:19:04 28 4
gpt4 key购买 nike

我们在 DropDownListFor(ASP.NET MVC3 版本)中发现了奇怪的行为。它在下拉列表中选择 ViewBag 属性值而不是 Model 属性值。

模型:

public class Country {
public string Name { get; set; }
}
public class User {
public Country Country { get; set; }
}

Controller 索引操作:
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", "Name", Model.Country), "...")

它将显示带有“俄罗斯”值的文本框和选择“丹麦”值而不是“俄罗斯”的下拉菜单。

我没有找到有关此行为的任何文档。这种行为正常吗?为什么是正常的?因为很难控制 ViewBag 和 Model 属性名称。

This sample MVC3 project sources

最佳答案

我不太确定为什么会做出这个决定,但这是因为 MVC 框架在使用参数提供的值之前尝试使用 ViewData 提供的值。这就是为什么ViewBag.Country覆盖参数提供的值 Model.Country .

就是这样 written在 MVC 框架中的 私有(private) 方法SelectInternal .

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带有新列表。

希望它可以提供帮助。谢谢。

side-node:ViewBag 只是 ViewData 的一个动态包装类。

关于asp.net-mvc-3 - DropDownListFor 中的 ViewBag 属性值,而不是 Model 属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4724143/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com