Asp.net mvc 在Html.EditorFor()中传递TimeSpan
我遇到了一个非常奇怪的例外情况。Asp.net mvc 在Html.EditorFor()中传递TimeSpan,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我遇到了一个非常奇怪的例外情况。 我有一个带有TimeSpan属性的模型,并尝试创建一个视图 public class Clock { [DataType(DataType.Time)] [DisplayFormat(DataFormatString = @"{0:hh\:mm}", ApplyFormatInEditMode = true)] public TimeSpan Time {get;set;} } @Html.EditorFor(model =>
我有一个带有TimeSpan属性的模型,并尝试创建一个视图
public class Clock {
[DataType(DataType.Time)]
[DisplayFormat(DataFormatString = @"{0:hh\:mm}", ApplyFormatInEditMode = true)]
public TimeSpan Time {get;set;}
}
@Html.EditorFor(model => model.Time)
这就是我得到的
[InvalidOperationException: The model item passed into the dictionary is of type 'System.TimeSpan', but this dictionary requires a model item of type 'System.String'.]
System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) +321071
System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) +377
System.Web.Mvc.WebViewPage`1.SetViewData(ViewDataDictionary viewData) +48
我曾在另一个项目中使用过这种技术,它是有效的,但在我当前的项目中它失败了,我不知道我的想法。可能我遗漏了什么或者什么东西被禁用了。我的答案与其说是一个解决方案,不如说是一个解决方案,因为我不确定异常的原因,但对我来说,如果我从TFS进行干净的签出,它会起作用。我的答案与其说是一个解决方案,不如说是一个解决方案,因为我不确定异常的原因,但对我来说,如果我从TFS进行干净的签出,它就可以工作。当使用
@Html.EditorFor()
时,MVC首先查看是否可以使用默认约定找到模板(或者您可能在自定义视图引擎中定义的模板)
如果它找不到一个——在您的例子中,您没有定义一个——那么它将使用内置模板。在TimeSpan
的情况下,它试图为String
类型使用模板,这导致了您看到的异常
您需要显式定义一个TimeSpan.cshtml
模板,使用@model TimeSpan
键入。当使用@Html.EditorFor()
时,MVC首先查看是否可以使用默认约定找到模板(或者您在自定义视图引擎中定义的模板)
如果它找不到一个——在您的例子中,您没有定义一个——那么它将使用内置模板。在TimeSpan
的情况下,它试图为String
类型使用模板,这导致了您看到的异常
您需要明确定义一个TimeSpan.cshtml
模板,用@model TimeSpan
键入编辑器模板是什么样子的?在我以前的项目中,我只有DateTime.cshtml模板,它可以工作。所以我还没有为TimeSpan创建编辑器模板。那就是你的问题了。它可能使用默认模板,作为编辑器模板,默认情况下,使用您根据名称设置的任何自定义模板,除非您通过指定模板名称进行覆盖。所以你应该创建一个TimeSpan编辑器模板来处理这种类型的属性。然后我不明白为什么它在另一个项目中工作。如果没有看到该项目的代码,我们也很难知道。但我猜测它不是TimeSpan类型,或者您定义了TimeSpan的编辑器模板,或者您没有使用编辑器模板。您当前的项目中是否有其他编辑器模板?编辑器模板是什么样子的?在我以前的项目中,我只有DateTime.cshtml模板,它可以工作。所以我还没有为TimeSpan创建编辑器模板。那就是你的问题了。它可能使用默认模板,作为编辑器模板,默认情况下,使用您根据名称设置的任何自定义模板,除非您通过指定模板名称进行覆盖。所以你应该创建一个TimeSpan编辑器模板来处理这种类型的属性。然后我不明白为什么它在另一个项目中工作。如果没有看到该项目的代码,我们也很难知道。但我猜测它不是TimeSpan类型,或者您定义了TimeSpan的编辑器模板,或者您没有使用编辑器模板。当前项目中是否有其他编辑器模板?