System.ArgumentException:无法将字符串值转换为日期

时间:2012-04-16 14:44:28

标签: asp.net ajax vb.net visual-studio visual-studio-2010

我有一个使用Ajax日期日历的网络表单。这很好用。我遇到的问题是,当我提交表单时,我收到以下消息。

'String value can not be converted to a date' .AgendaDate = New SmartDate(txtAgendaDate.Text)

这是我的网页表单,其中包含日历和相关的文本框...

 <td>
     <asp:TextBox ID="txtAgendaDate" runat="server" ForeColor="Black" ></asp:TextBox>
 </td>
 <td>
     <asp:ImageButton runat="Server" ID="ImageButton1" ImageUrl="~/images/calendarpic.png" 
                AlternateText="Click here to display calendar" />

     <cc1:calendarextender ID="CalendarExtender1" runat="server" 
                     TargetControlID="txtAgendaDate" PopupButtonID="ImageButton1" >
     </cc1:calendarextender>
 </td>

我有一个类,其中包含Web表单的相关属性。其余字段工作并向数据库提交数据,但ajax日历的文本字段除外。

这是我的类的代码和txtAgendaDate代码的精简版...

#Region " Agenda Variables "

'Declare Variables and data types and set default values
Private mAgendaID As Integer = 0
Private mOrganiser As String = ""
Private mMeeting As String = ""
Private mAgendaDate As SmartDate = New SmartDate()

#End Region

#Region " Constructors "

Public Sub New()
End Sub

Public Sub New(ByVal reader As SafeDataReader)
    '  Public Sub New(ByVal reader As SQLDataReader)

    'Combine variables & property types
    With reader
        mAgendaID = .GetInt32("AgendaID")
        mOrganiser = .GetString("Organiser")
        mMeeting = .GetString("Meeting")
        mAgendaDate = .GetSmartDate("AgendaDate")
    End With
End Sub

#End Region

#Region "Properties"

'Define form field properies so that they can be used when adding the data to the database on the add button is pressed.
Public Property AgendaID() As Integer
    Get
        Return mAgendaID
    End Get
    Set(ByVal Value As Integer)
        mAgendaID = Value
    End Set
End Property

Public Property Organiser() As String
    Get
        Return mOrganiser
    End Get
    Set(ByVal value As String)
        mOrganiser = value
    End Set
End Property

Public Property Meeting() As String
    Get
        Return mMeeting
    End Get
    Set(ByVal value As String)
        mMeeting = value
    End Set
End Property

Public Property AgendaDate() As SmartDate
    Get
        Return mAgendaDate
    End Get
    Set(ByVal Value As SmartDate)
        mAgendaDate = Value
    End Set
End Property

#End Region


End Class

这是我的命令,它看起来连接到数据库和存储过程,并且还有参数。

Public Class Agenda_TempDAL

Public Shared Function AddAgenda_Temp(ByVal Agenda_Temp As Agenda_Temp) As Integer

    'Declare i as integer as 0
    Dim iAgendaID As Integer = 0

    'Database conn, this is linked to the web config file .AppSettings
    Using dbconnection As New SqlConnection(ConfigurationManager.AppSettings("dbconnection"))
        dbconnection.Open()

        'Command to state the stored procedure and the name of the stored procedure
        Using dbcommand As SqlCommand = dbconnection.CreateCommand
            With dbcommand
                .CommandType = CommandType.StoredProcedure
                .CommandText = "Stored_Proc_Name"

                'Create parameter for AgendaID and output
                Dim oParam As New SqlParameter
                oParam.ParameterName = "@AgendaID"
                oParam.Direction = ParameterDirection.Output
                oParam.SqlDbType = SqlDbType.Int

                'Create parameters for the remaining fields
                .Parameters.Add(oParam)
                .Parameters.AddWithValue("@Organiser", Agenda_Temp.Organiser)
                .Parameters.AddWithValue("@Meeting", Agenda_Temp.Meeting)
                .Parameters.AddWithValue("@AgendaDate", Agenda_Temp.AgendaDate.DBValue)

                'Simply execute the query
                dbcommand.ExecuteNonQuery()

            End With
        End Using
    End Using

    'Need to return the agendaID as an integer.
    Return iAgendaID

End Function
End Class 

这是网页按钮背后的代码。这是基于属性/字段导致错误的页面。问题在于这条线......

.AgendaDate = New SmartDate(txtAgendaDate.Text)

按钮的整个代码在这里......

Protected Sub btnAddAgendaTemplate_Click(ByVal sender As Object, ByVal e As    System.EventArgs) Handles btnAddAgendaTemplate.Click

    'This works alongside the Class named Agenda_Temp which has the properties and DB connection assigned to it for each web form field.
    Dim oAgenda_Temp As New Agenda_Temp

    'Within the object Agenda_Temp Class use the properties defined. 
    'They are required to be defined in the Agenda_Temp/ app code so we can use them within here.

     With oAgenda_Temp
        .Organiser = txtOrganiser.Text
        .Meeting = txtMeeting.Text
        .AgendaDate = New SmartDate(txtAgendaDate.Text)


        'Within the object Agenda_Temp class use the defined DAL which includes all the DC connect and stored procedures.  
        oAgenda_Temp.AgendaID = Agenda_TempDAL.AddAgenda_Temp(oAgenda_Temp)
    End With

End Sub
End Class

据我所知,它告诉我字符串值无法转换为日期,但我不知道如何解决此问题,因为我是.net 2010的新手?

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:0)

将字符串转换为新版之前的日期: 来自MSDN:

string date = "01/08/2008";
DateTime dt = Convert.ToDateTime(date); 

你的将成为

DateTime dt = Convert.ToDateTime(txtAgendaDate.Text)

然后将日期传递给SmartDate构造函数:

oAgenda_Temp.AgendaDate = new SmartDate(dt)

最终结果:

  With oAgenda_Temp
        .Organiser = txtOrganiser.Text
        .Meeting = txtMeeting.Text
        .AgendaDate = New SmartDate(Convert.ToDateTime(txtAgendaDate.Text))


        'Within the object Agenda_Temp class use the defined DAL which includes all the DC connect and stored procedures.  
        oAgenda_Temp.AgendaID = Agenda_TempDAL.AddAgenda_Temp(oAgenda_Temp)
    End With

答案 1 :(得分:0)

正如其他人所指出的,您需要将输入值转换为DateTime。我不知道SmartDate()函数正在做什么,但错误消息清楚地表明该值无法转换为日期。

其次,我会添加一些验证,以确保在您提交页面之前输入有效。使用RequiredFieldValidatorCompareValidatorRegularExpressionValidator

<asp:TextBox ID="txtDate" runat="server" ... />
<asp:RequiredFieldValidator ID="reqDate" runat="server" ErrorMessage="Required" Display="Dynamic" ControlToValidate="txtDate"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="regDate" runat="server" ControlToValidate="txtDate" ErrorMessage="Please enter a valid date in the format (mm/dd/yyyy)" ValidationExpression="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"></asp:RegularExpressionValidator>