0

如果我将数据放在jquery 对话框中,我似乎无法使用我的 asp detailsview 将数据插入到我的数据库中。但是,只要我将它直接放在页面内,它就可以正常工作。

当我将它放在对话框中时,我仍然可以填写信息,但是当我提交 SQL 服务器时抱怨使用 NULL 值,如下所示:

 Cannot insert the value NULL into column 'Alias', table 'GSSNetDB.dbo.GSSNet_EndUsers'; column does not allow nulls

因此,由于某种原因,似乎回发功能无法从对话框内的 html 表单中读取信息。

我使用这个创建对话框:

<div id="dialogEndUser" title="Create new user">
    <asp:DetailsView 
        ID="DetailsView_EndUsers"
        runat="server"
        Caption="Enter new user details"
        Visible="True"

        AutoGenerateInsertButton="True"
        AutoGenerateRows="False"

        DataKeyNames="Alias"
        DataSourceID="EndUserSource"
        DefaultMode="Insert">
        <Fields>
          <asp:BoundField DataField="Alias" HeaderText="Alias" ReadOnly="True" SortExpression="Alias" />
          <asp:BoundField DataField="Address" HeaderText="Address*" SortExpression="Address" />
          <asp:BoundField DataField="Name" HeaderText="Name*" SortExpression="Name" />
          <asp:BoundField DataField="Device_Key" HeaderText="Device Key" SortExpression="Device_Key" />
          <asp:BoundField DataField="Phone_Number" HeaderText="Phone_Number" SortExpression="Phone_Number" />
          <asp:BoundField DataField="E_mail" HeaderText="E-mail" SortExpression="E_mail" />
          <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
        </Fields>
    </asp:DetailsView>
</div>

实际弹出窗口使用:

$(function () {
  $("#dialogEndUser").dialog({
    height: 350,
    width: 300,
    position: "top",
    modal: false,
    autoOpen: false
  });
});

数据源如下所示:

<asp:SqlDataSource ID="EndUserSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:GSSNetDB %>"   
    InsertCommand="INSERT INTO [Users] ([Alias], [Address], [Device_Key], [Name], [Phone_Number], [E_mail], [Description]) VALUES (@Alias, @Address, @Device_Key, @Name, @Phone_Number, @E_mail, @Description)">
  <InsertParameters>
    <asp:Parameter Name="Alias" Type="String" />
    <asp:Parameter Name="Address" Type="String" />
    <asp:Parameter Name="Device_Key" Type="String" />
    <asp:Parameter Name="Name" Type="String" />
    <asp:Parameter Name="Phone_Number" Type="String" />
    <asp:Parameter Name="E_mail" Type="String" />
    <asp:Parameter Name="Description" Type="String" />
  </InsertParameters>
</asp:SqlDataSource>

如果有人可以帮助我或提供有关如何解决问题的任何指示,我将不胜感激。如果有人有推荐,也许可以尝试使用不同的对话系统?

谢谢你的时间!

4

2 回答 2

1

我认为,尽管您确实设置了参数,但dataKeyName="Alias"您的 insertCommand 参数没有任何值,因为您将此 boundField 设置为ReadOnly="True".

InsertCommand="INSERT INTO [Users] (
           [Alias], [Address], [Device_Key], [Name], [Phone_Number], [E_mail], [Description]) 
    VALUES (@Alias, @Address, @Device_Key, @Name, @Phone_Number, @E_mail, @Description)"

您能否验证@Alias 在插入时是否有值?(例如:使用 SqlDataSource 和 debug/watch 的插入事件e.Command.Parameters["@Alias"]

另一方面,您写道,如果您将 detailsView 放在 jQuery 对话框之外,它工作正常 ,这让我想知道?!我错过了什么吗?欢迎任何意见/反馈!

于 2012-09-17T15:09:51.350 回答
0

问题是 jQuery 在 FORM 元素之外创建了它的浮动 DIV 元素,并将 DetailView 表移动到这些 div 中;因此这些值不会包含在回发中。您可以通过在表单外部的页面上创建一个文本框来测试这一点,input(runat=server)并观察它在回发后不会返回值。当对话框可见时,您可以通过使用浏览器的开发人员工具检查页面来查看表单元素之外的 div 元素。

我还不确定我将如何解决这个问题。我的第一个想法是在对话框关闭之前使用 JavaScript 从 DetailsView 表中的输入更新表单中的隐藏字段;尽管这会消除DetailsView控件的有用性。它可能比这更简单,因为我希望有一种简单的方法来告诉 jQuery 在表单元素中构建它的对话框 div。如果我发现任何东西,我会稍微研究一下 jQuery 修复并再次发布。

于 2013-11-07T16:21:00.030 回答