• jqGrid对可空日期类型数据转换时的错误处理


    用jqGrid展现数据库表,若数据库表存在日期类型,则在poco中要声明可空字段类型。如以下FillinDate 字段:

    public class Project2Weekly

    {
    public int Id { get; set; }
    public string Progress { get; set; }
    public string Problem { get; set; }
    public string NextPlan { get; set; }
    public string Evidence { get; set; }
    public DateTime? FillinDate { get; set; }
    public string FillinMan { get; set; }
    public int Pid { get; set; }
    }

    当用户在编辑完表数据保存时,一般要调用JqGrid.EditParams方法对Form上的数据进行转换,如:

    public JsonResult EditWeekly()
    {
    NameValueCollection nvc = Request.Form;
    Project2Weekly model = JqGrid.EditParams<Project2Weekly>(nvc);
    manager.EditWeekly(model);
    return Json(new { success = true });
    }

    实践发现,Form上日期类型总是保存不到数据库中。跟踪发现,poco中的DateTime?数据类型在 JqGrid.EditParams方法中没有被识别为DateTime类型,而是被识别为“Nullable`1”(System.Nullable`1[System.DateTime]),导致值被设置为null。以下为JqGrid.EditParams方法部分源代码:

    public static T EditParams<T>(NameValueCollection nvc)

            {

                Type type = typeof(T);

                PropertyInfo[] pis = type.GetProperties();

     

                T t = (T)Activator.CreateInstance(type);

     

                foreach (PropertyInfo pi in pis)

                {

                    string data = nvc[pi.Name] == null ? "" : nvc[pi.Name].ToString().Trim();

                    dynamic value;

                    switch (pi.PropertyType.Name)

                    {

                        case "DateTime":

                            if (data == "")

                                value = DateTime.MinValue;

                            else

                            {

                                value = Convert.ToDateTime(data);

                                if (value == DateTime.MinValue)

                                    value = DateTime.Now;

                            }

                            break;

                            .

                            .

                            .

                        case "String":

                            value = data;

                            break;

                        default:

                            value = null;

                            break;

                    }

     

                    pi.SetValue(t, value, null);

                }

     

                return t;

            }

        }

    解决此问题的方法也很简单,在case "DateTime" 代码处增加一行来处理"Nullable`1"类型即可。代码修改如下:

                    switch (pi.PropertyType.Name)

                    {

                        case "DateTime":

                        case "Nullable`1":

     

                            if (data == "")

                                value = DateTime.MinValue;

                            else

                            {

                                value = Convert.ToDateTime(data);

                                if (value == DateTime.MinValue)

                                    value = DateTime.Now;

                            }

                            break;

  • 相关阅读:
    什么是线程组,为什么在 Java 中不推荐使用?
    什么是 FutureTask?使用 ExecutorService 启动任务?
    Java 中用到的线程调度算法是什么?
    什么是阻塞队列?阻塞队列的实现原理是什么?如何使用 阻塞队列来实现生产者-消费者模型?
    说说对 SQL 语句优化有哪些方法?(选择几条)
    什么是 Executors 框架?
    Java Concurrency API 中的 Lock 接口(Lock interface) 是什么?对比同步它有什么优势?
    什么是原子操作?在 Java Concurrency API 中有哪些原 子类(atomic classes)?
    Java 中你怎样唤醒一个阻塞的线程?
    你将如何使用 thread dump?你将如何分析 Thread dump?
  • 原文地址:https://www.cnblogs.com/jackkwok/p/3110491.html
Copyright © 2020-2023  润新知