我正在使用LINQ,并且有一些DateTime属性?类型。
如果我现在想要从文本框中添加值,我似乎无法使其工作。
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ScoringLastUpgrade", DbType="Date")]
public System.Nullable<System.DateTime> ScoringLastUpgrade
我使用的文本框我用javascript确定格式为'2011-06-17'
但是现在当我尝试这样做时:
myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text).ToShortDateString();
我收到此错误:“无法将类型字符串转换为DateTime?”
怎么做?
答案 0 :(得分:3)
.ToShortDateString()
调用正在将其转换为字符串。你应该删除那个电话。
另外,你说你已经确定了javascript的格式。如果用户没有javascript,你也应该进行服务器端检查。此外,由于它采用给定格式,因此您可以使用DateTime.ParseExact
或DateTime.TryParseExact
(因此无效格式不会引发异常),因为它更有效。 (格式字符串将是"yyyy-MM-dd"
)我相信。
答案 1 :(得分:2)
不要使用'ToShortDateTimeString'将其转换为字符串,只需设置Convert.ToDateTime
的结果:
myObject.ScoringLastUpgrade = Convert.ToDateTime(txtScoringUpgradeDate.Text);
假设您已对txtScoringUpgradeDate.Text
进行了充分的验证?
我在处理这些类型转换时的偏好是使用TryParse
方法,例如:
DateTime date;
if (DateTime.TryParse(txtScoringUpgradeDate.Text, out date))
myObject.ScoringLastUpgrade = date;
Convert.ToDateTime
与显式DateTime.Parse
非常相似,会在出现异常值时抛出InvalidCastException
。最好让你的代码容错,然后抓住异常。
更新:根据您的上次评论:
在这种情况下,您不应该返回DateTime.MinValue
,因为MinValue
小于datetime
列支持的最小值。 CLR DateTime
支持的日期范围低至0000-01-01,而SQL datetime
(以及比较CLR SqlDateTime
类型)支持的最小值为1753-01- 01。由于它是可空的DateTime
,您应该将其设置为null:
public static DateTime? ToNullableDateTime(this string date)
{
DateTime dateTime;
return (DateTime.TryParse(date, out dateTime))
? (DateTime?)dateTime
: null;
}
答案 2 :(得分:0)
问题是您已将ToShortDateString()
放在那里,有效地将DateTime
再次转换回string
。尝试删除该部分行。
答案 3 :(得分:0)
在我的情况下(.cshtml):
<td>@item.InvoiceDate.Value.ToShortDateString().ToString()</td>
InvoiceDtae在DB
中是可为空的日期