执行搜索正确的数据类型

时间:2015-09-09 10:02:19

标签: c# asp.net-mvc nhibernate

编程的新手,我正在使用MVC.net nhibernate构建一个网页,在我的控制器中我使用FormCollection fm对象和jquery数据表。我的问题是我有一个文本框搜索,它应该在我的数据表中搜索附加在照片中的数据,我能够搜索任何字符串,但我无法搜索金额或日期,有人让我使用Tryparse,但我不明白为什么我需要它,我应该解析什么?它有一个if而其他我不知道在它们写什么我附加了一些可以搜索字符串的代码如下:

enter image description here

if (!string.IsNullOrEmpty(fm["SearchValue"]) && !string.IsNullOrEmpty(fm["SearchType"]))
                         {
                             criteria.Add(Restrictions.Like(fm["SearchType"], "%" + fm["MobileNo"] + "%"));

我已尝试过金额,但从未奏效:

string SearchValue = fm["SearchValue"];
                       decimal Amount; 
                       if (decimal.TryParse(SearchValue, out Amount))
                       criteria.Add(Restrictions.Eq(fm["SearchValue"], Amount)); 

我已经为日期和小数做过这个但是它不知道出了什么问题?我觉得它里面的如果不确定

 decimal Amount;
                             if (decimal.TryParse(fm["SearchValue"], out Amount))
                             {
                                 criteria.Add(Restrictions.Eq(fm["SearchValue"], Amount));

                             }



                            DateTime TransactionDate;
                             if (DateTime.TryParseExact(fm["SearchValue"], "dd MM yyyy HH:mm:ss", new CultureInfo("en-US"), DateTimeStyles.None,
                                out TransactionDate))

                            {
                                criteria.Add(Restrictions.Like(fm["SearchType"], "%" + TransactionDate + "%"));

                            }

1 个答案:

答案 0 :(得分:0)

TryParse确实解析了字符串,只有在类型正确时才返回true:

DateTime date;
if (DateTime.TryParse(fm["SearchValue"], out date))
{
    // criteria.Add
}

out date部分允许函数输出已解析的DateTime,以便您可以使用它。

请注意,如果您只希望日期为特定格式,则可能会产生不良影响。例如,此命令将使用默认的区域设置,并可能基于此在DD / MM / YYYY和MM / DD / YYYY之间切换。

如果你知道你期望的日期格式,你可以使用TryParseExact:

DateTime date;
if (DateTime.TryParseExact(fm["SearchValue"],
    @"yyyy-MM-dd HH:mm:ss", // or any other DateTime format string
    CultureInfo.InvariantCulture, 
    DateTimeStyles.AssumeUniversal, 
    out date)
{
    // criteria.Add
}

您可以通过这种方式TryParse多种类型,例如:

if (int.Parse(value, out integer))

由于可以输入有效日期/时间的方式很多,DateTime示例可能是最复杂的。

修改

如果您在确切地解决出现问题时遇到问题,可以更轻松地将Console项目添加到您的解决方案并从那里测试代码。这样,您可以快速轻松地针对您的代码测试许多不同的字符串值,并确切地确定哪些是有效的 - 或者确实确定整个TryParse是否不适合您。

编辑2:

代码本身看起来很好,因此留下了两种可能性

1)可能fm["SearchValue"]为空或不是有效小数。 2)替代方案是criteria.Add(Restrictions.Eq(fm["SearchValue"], Amount));由于某种原因无效 - 这里可能存在任何问题。

通常在调试Web应用程序时,很难简单地停止并提供一些信息。假设您在web.config中启用了调试模式,我发现一种简单的方法来检查这是在if中添加throw new Exception("THIS WORKED!");,如下所示:

decimal dec;
if (decimal.TryParse(fm["SearchValue"], out dec))
{
    throw new Exception("THIS WORKED!");
}

这样你至少知道decimal.TryParse是否成功。如果您看到该消息,则可以将注意力集中在criteria.add行上。

如果您没有看到该消息,则表示decimal.TryParse返回false,即fm["SearchValue"]的内容不是有效小数。此时,您可以再次使用相同的技巧来仔细检查值是什么,如下所示:

throw new Exception("!" + fm["SearchValue"] + "!");

注意 - 我已经在值周围添加了字符,因此您可以更轻松地查看该值是否只是一个空字符串。

通常你永远不会抛出这样的原始异常,但它是一种非常快速简便的方法,可以在MVC页面生命周期的任何阶段恢复一些调试数据。