C#字符串包含应分成2个日期的日期范围

时间:2017-02-07 12:47:57

标签: c# asp.net-mvc asp.net-mvc-4

我正在努力解决问题。我有一个字符串,其中包含以下格式的日期范围" dd.MM.yyyy - dd.MM.yyyy"。

var datest = shippeddaterange.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
var startDate = DateTime.Parse(datest[0]);
var endDate = DateTime.Parse(datest[1]);

现在我想将它拆分为2个变量,所以我可以使用我的Lambda Query,它可以正常工作。我的2个新变量应命名为startDateendDate

data.Container = db.Container
  .Where(a => a.ShippedDate >= startDate && a.ShippedDate <= endDate)
  .ToList();

如果我编译应用程序,它会给出错误,即数组值超出索引范围

2 个答案:

答案 0 :(得分:3)

你需要做一些防御性编码。不要假设金发姑娘的情况,因为你将进行一次粗鲁的觉醒。如果输入不好,那么你有可能不会得到2个项目。

public PartialViewResult SearchData(shippeddaterange) { 
    data = new ContentViewModel();
    using (var db = new PLSDb()) {
        var datest = shippeddaterange.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
        if(datest.Length == 2) {
            var format = "dd.MM.yyyy";
            var provider = CultureInfo.InvariantCulture;
            var startDate = DateTime.ParseExact(datest[0].Trim(), format, provider);
            var endDate = DateTime.ParseExact(datest[1].Trim(), format, provider);

            data.Container = db.Container
              .Where(a => a.ShippedDate >= startDate && a.ShippedDate <= endDate)
              .ToList();                
        }            
    }
    return PartialView(data);        
}

答案 1 :(得分:2)

这里的效果非常好。我将写入方法public ActionResult Index(),在过滤器开始运行之前应该过滤数据。谢谢你的帮助!

    public PartialViewResult SearchData(string shippeddaterange)
    {            
        using (var db = new PCSDb())
        {

            var datest = shippeddaterange.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
            if (datest.Length == 2)
            {
                var format = "dd.MM.yyyy";
                var provider = CultureInfo.InvariantCulture;
                var startDate = DateTime.ParseExact(datest[0].Trim(), format, provider);
                var endDate = DateTime.ParseExact(datest[1].Trim(), format, provider);

                var data = new ContentViewModel();

                data.Container = db.Container.Where(a => a.ShippedDate >= startDate && a.ShippedDate <= endDate).ToList();
                return PartialView(data);
            }
            else
            {
                return PartialView("NameOfANewView");
            }                
        }
    }