我正在使用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?"
如何做到这一点?
.ToShortDateString()
调用正在将其转换为字符串。您应该删除该调用。
另外,您说您已经用javascript确定了格式。如果用户没有javascript,您也应该进行服务器端检查。此外,由于它是给定的格式,您可以使用DateTime.ParseExact
或DateTime.TryParseExact
(因此无效格式不会引发异常),因为它更有效。(格式字符串应该是"yyyy-MM-dd"
)我相信。
不要使用"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的最小值。由于它是一个可为null的DateTime
,您应该将其设置为null:
public static DateTime? ToNullableDateTime(this string date)
{
DateTime dateTime;
return (DateTime.TryParse(date, out dateTime))
? (DateTime?)dateTime
: null;
}
问题是您已经将ToShortDateString()
放在了那里的末尾,从而有效地将DateTime
再次转换回string
。试着去掉那部分线路。
在我的例子中(.cs.html):
<td>@item.InvoiceDate.Value.ToShortDateString().ToString()</td>
其中InvoiceTae是DB 中可为空的日期