我有一个数据源,正在递交IEnumerable<SelectListItem>
每个selectListItem中的文本都是大写的。我想找到最简单的方法将它们更改为正确的情况而不实际更改数据源。
答案 0 :(得分:3)
我认为最好的答案可能是在传递给您的视图之前将您的Enumerable转换为SelectListItems,然后将案例转换为TitleCase。一些虚假代码:
鉴于此DataSource:
EnumerableItems = new List<string>() { "ITEM ONE", "ITEM TWO" };
我在ViewModel上有这个:
public string BoundValue { get; set; }
public IEnumerable<SelectListItem> SelectListItems { get; set; }
我像这样设置SelectListItem:
viewModel.SelectListItems = from e in EnumerableItems
select new SelectListItem
{
Selected = e == dto.BoundValue,
Text = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(e.ToLower()),
Value = e
};
在我看来像:
@Html.DropDownList("BoundValue", new SelectList(Model.SelectListItems, "Value", "Text"), "-- select --")
我明白了:
理论上我认为你也可以通过调用ToTileCase来改变视图中的情况,其中&#34; Text&#34;争论是,但我认为那将不那么干净。
编辑:我修改了创建SelectListItem的代码,使Value保持大写(e,而不是e.ToTitleCase()) - 因为我猜它会绑定到原始数据源最终:)
答案 1 :(得分:0)
好的,努力提供一点方向。如果您拥有 每个列表项的类,则您有一个选项。覆盖ToString()
方法。像这样可能:
public override string ToString()
{
// here is a really primitive algorithm
return string.Format("{0}{1}",
this.DisplayProperty.Take(1),
this.DisplayProperty.Substring(1).ToLower());
}
但是,如果您不拥有 每个列表项的类,那么您会因为不想修改数据源而陷入困境。