c# - 不错的简单 ASP.NET MVC2 C# 问题(Switch 语句)

标签 c# asp.net-mvc-2

早上好

我有以下代码行:

 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/

相关文章:

c# - .Net 中的并行性是否可以接管 CPU 并可能拒绝为其他进程提供服务?

.net - ASP .NET 虚拟路径提供程序 HttpCompileException

asp.net - 将复杂的 JSON 数据 jQuery 传递给 Action

asp.net-mvc-2 - 缺少 asp.net mvc 中 GetEnumerator 的公共(public)定义?

nhibernate - 使用 asp mvc 2 和 nhibernate 的单个网站多个​​连接字符串

c# - 不同的 "translated"JsonProperty 名称

C# 泛型委托(delegate)的异步调用

c# - 无法加载或创建VS 2015.1。项目。无法创建Visual C#2015编译器

c# - 如果子字符串在单词中,则获取该单词之前的索引值

C# - 包装日期、月份、年份