早上好
我有以下代码行:
var viewModel = new ClassifiedsBrowseViewModel
{
Category = categoryModel,
Listings = categoryModel.Listings.OrderBy(c => c.Price).ToList()
};
世界上一切都很好,这段代码工作正常。但现在我想添加一个 switch 语句,允许我更改我订购列表的方式(在上面的代码中它是按价格订购的)。
所以我显然不能在新模型减速中使用 switch 语句,所以我将把 switch 语句放在上面,例如:
switch(searchCriteria)
{
case "Price":
break;
case default:
break;
}
所以我的问题是如何将两者联系起来?顺便说一句,列表在 ViewModel 中声明为:
public List<Listing> Listings { get; set; }
我想我可以在 Controller 中声明一个 Listings 变量,然后在 Switch 中将该变量设置为 categoryModel.Listings.OrderBy(c => c.[Search Criteria]).ToList()然后简单地有 Listings = Listings ?
非常感谢, J
使用
使用 Ribon 的方法:
var viewModel = new ClassifiedsBrowseViewModel
{
Category = categoryModel,
Listings = categoryModel.Listings.OrderBy(c =>
{
switch (searchCriteria)
{
case "Price": return c.Price;
case "FuelType": return c.FuelType;
default: return c.Price;
}
}).ToList()
};
最佳答案
IMO 一个漂亮、干净且可读的解决方案是创建一个接受 IQueryable 的扩展方法,以及一个代表各种排序选项的枚举。
public static IOrderedQueryable<Listing> WithListingOrder(this IQueryable<Listing> source, PriceOrderingOptions orderBy)
{
switch (orderBy)
{
case ListingOrderingOptions.Price:
return source.OrderBy(x => x.Price);
... // other enumerations
}
}
我有一个通用的排序扩展方法(采用 T、TKey),但在您的情况下,由于您使用的是字符串(搜索条件),因此不能在此处使用泛型。
但我认为将排序选项表示为枚举应该可以防止出现“魔术字符串”。
然后像这样使用它:
var searchCritera = ListingOrderingOptions.Price;
var viewModel = new ClassifiedsBrowseViewModel
{
Category = categoryModel,
Listings = categoryModel.Listings.WithListingOrder(searchCriteria)
}).ToList()
};
这里的主要好处是您隐藏扩展背后的丑陋开关 - 这里的目标是保持您的 Controller 干净。
关于c# - 不错的简单 ASP.NET MVC2 C# 问题(Switch 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4172496/