使用可为null的DateTime



我正在使用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.ParseExactDateTime.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 中可为空的日期

相关内容

  • 没有找到相关文章