正常的项目,在今天突然报错

”Conversion failed when converting date and/or time from character string.“

”从字符串转换日期和/或时间时,转换失败“

最终跟踪sql,发现是linq将CreateDateTime(2012,2,29,0,0,0)转换成如下语句

DATEADD(year, 2012 - 1, convert (datetime2,'0001' + '-' + convert(varchar(255), 2) + '-' + convert(varchar(255), 29) + ' ' + convert(varchar(255), 0) + ':' + convert(varchar(255), 0) + ':' + str(cast(0 as float(53)), 10, 7), 121)))

就是先把从'0001-2-29 0:0:0'字符串转换为datetime,然后在给datetime加上2011年,得到最终结果2012-2-29

但是在第一步就报错了,因为没有0001-2-29这天,想来是开发entity framework的小组没有想到这种情况。

所以我们想办法规避一下就好了,搜索了一下, 也有人遇到了问题,可以参考他的解决方法

http://www.morgia.info/BlogEngine/post/2012/02/29/Entity-Framework-EntityFunctionsCreateDateTime-and-Leap-Year.aspx

而因为我是要用日期来group by,所以我采用了如下的方法

group i by EntityFunctions.CreateDateTime(i.PostTime.Year, i.PostTime.Month, i.PostTime.Day, 0, 0, 0) into g

替换为

group i by new { i.PostTime.Year, i.PostTime.Month, i.PostTime.Day } into g

解决。

不过这也不是最终解决之道,还是要等ms来修复这个bug吧


从字符串转换日期和/或时间时,转换失败

posted @ 2012-03-01 12:05 Rwing 阅读(23) 评论(0) 编辑

ASP.NET MVC 2 的RC版已经发布有些日子了,提供了很好的强类型helper,例如使用

<%= Html.TextBoxFor(m => m.User.Username) %>

来取代

<%= Html.TextBox("Username") %>

不过我个人还是不大敢在正式项目中使用非正式版的,所以将此功能移植到MVC1,其实也就是表达式树的解析,那么我们直接用MVC2的代码就好了,MVC2的ExpressionHelper类中有提供GetExpressionText(string expression)的方法.

 

可是,MVC2中仍然没有提供生成link的强类型方法,如

<%= Html.ActionLink<HomeController>(c => c.Index(), "Home") %>

仍然是

<%= Html.ActionLink("Home", "Index", "Home")%>

不过庆幸的是,包含在MVC中的MvcFutures项目有提供这类功能,直接使用或提取相关方法吧

 

事实上,我们应该尽量使用强类型数据,例如RedirectToAction等方法都应该有其强类型的重载

[下载与文章相关的提取自MVC2及MvcFutures中的类]

posted @ 2010-01-29 19:36 Rwing 阅读(151) 评论(0) 编辑

微软发布的ASP.NET MVC是开源的,这样我们就可以在项目里引用源项目,给调试和理解ASP.NET MVC framework带来方便,具体步骤如下:

Step 1.从http://aspnet.codeplex.com/下载源代码

  这里提供了MVC 1及MVC 2RC的源代码

Step 2.将解压的源项目引用到当前解决方案

Step 3.修改当前项目的引用(References),删除掉旧的引用,引用在本解决方案内的MVC

Step 4.修改当前项目中的Web.config,找到system.web节点下的

  <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  注释掉它,继续找到Views/Web.config中的多处PublicKeyToken=31BF3856AD364E35,改成PublicKeyToken=null,或者干脆删掉它

 

OK,至此,完毕

posted @ 2010-01-26 19:01 Rwing 阅读(178) 评论(0) 编辑

不知道大家有没有注意到,在使用HtmlHelper.CheckBox()时会生成如下的HTML代码:

 

<input id="CheckBox" name="CheckBox" type="checkbox" value="true" />
<input name="CheckBox" type="hidden" value="false" />

 

会生成2个input标签,其中一个是hidden的.熟悉HTML的都知道,其实一个input完全够用了.

那么这个hidden起的什么作用呢?翻看ASP.NET MVC的源代码会找到:

// Render an additional <input type="hidden".../> for checkboxes. This
// addresses scenarios where unchecked checkboxes are not sent in the request.
// Sending a hidden input makes it possible to know that the checkbox was present
// on the page when the request was submitted.

意思就说,如果有多个checkbox,当发送到服务器端时,只会将选中的checkbox的值发送到出去,未选中的checkbox不会发送,这样也就无法得知一共有多少个checkbox以及未被选中的checkbox的值了.增加的这个hidden就是起这个作用的.

那么追求完美的人(或者称之为变态...例如我...)就希望只生成一个checkbox的input就好了,ok,那么让我们自己动手来扩展一个NewCheckBox吧

(代码就不贴了,很容易写出来)......

当仅仅使用1个input的时候,你会发现在Controller中会接收不到这个bool值

例如

<%= Html.NewCheckBox("isChecked")%>

...

public ActionResult Index(bool isChecked){}

这时isChecked是接收不到的,因为这时checkbox post到服务器的值是ON或空(或value不为空则为value值,参见html基础),自然也就无法转换成bool了,ok,那也容易解决,自己建立一个ModelBinder就好了

 

public class CheckBoxModelBinder : IModelBinder
{
    
#region IModelBinder Members

    
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value 
= controllerContext.HttpContext.Request.Form[bindingContext.ModelName];
        
return string.IsNullOrEmpty(value) || value.Equals("FALSE", StringComparison.OrdinalIgnoreCase) ? 
            false : true;
    }

    
#endregion
}

 

然后在建立相应的Attribute

 

public class CheckBoxAttribute : CustomModelBinderAttribute
{
    
private static CheckBoxModelBinder _modelBinder = new CheckBoxModelBinder();

    
public override IModelBinder GetBinder()
    {
        
return _modelBinder;
    }
}

 

 再修改Action加上这个Attribute

public ActionResult Index([CheckBox]bool isChecked){}

OK,完成

 

后记:其实2个input完全可以接受,就多那么几个字节..不过变态嘛

posted @ 2010-01-15 10:34 Rwing 阅读(364) 评论(1) 编辑