我正在使用带有 SQLDataSource 选择/插入/更新命令的 Gridview。它适用于使用 Gridview 更新或更改值。然而最近我添加了另一个使用 Javascript 检索数据的插件,我需要检索数据作为 SQL 的源数据。有什么办法可以做到这一点吗?
类似这样的:
<form id="form1" runat="server">
<div>
<input type="hidden" id="newname" runat="server" />
<br />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID_AM" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="StaffID" HeaderText="StaffID" SortExpression="StaffID" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT [ID], [Name], [StaffID] FROM [Record]"
ConflictDetection="CompareAllValues"
UpdateCommand="UPDATE [Record] SET [Name] = @Name, [StaffID] = @StaffID WHERE [ID] = @original_ID AND (([Name] = @original_Name) OR ([Name] IS NULL AND @original_Name IS NULL)) AND (([StaffID] = @original_StaffID) OR ([StaffID] IS NULL AND @original_StaffID IS NULL))">
<UpdateParameters>
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="StaffID" Type="String" />
<asp:Parameter Name="original_ID" Type="Int32" />
<asp:Parameter Name="original_Name" Type="String" />
<asp:Parameter Name="original_StaffID" Type="String" />
</UpdateParameters>
</asp:SqlDataSource>
</div>
</form>
当我使用 Gridview 更新行时,插件将生成一个新名称并存储在隐藏输入“newname.value”中。如何将该值放入更新参数中?
我正在考虑一些方法:
我假设您正在使用asp.net webforms,也就是说,没有(简单)方法可以使服务器端asp.net数据源与客户端javascript接口,而不需要基于javascript编写您自己的asp.net控件插件。
话虽这么说,我发现最简单的方法是使用 webmethods。如果您更喜欢使用 Jquery,请参阅此链接。如果您希望 ASP.NET 完成繁重的工作,请参阅此链接。我更喜欢链接 2,所以要点如下:
首先,您需要向页面添加一个 scriptManager,它将“编写”javascript 函数以异步调用服务器端 webmethods,这将位于您的 aspx 文件中:
<head runat="server">
<title></title>
<script type="text/javascript">
function HandleIT() {
var name = document.getElementById('<%=txtname.ClientID %>').value;
var address = document.getElementById('<%=txtaddress.ClientID %>').value;
PageMethods.ProcessIT(name, address, onSucess, onError);
function onSucess(result) {
alert(result);
}
function onError(result) {
alert('Something wrong.');
}
}
</script>
</head>
<div>
<p>Say bye-bey to Postbacks.</p>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
<asp:TextBox ID="txtname" runat="server"></asp:TextBox>
<br />
<asp:TextBox ID="txtaddress" runat="server"></asp:TextBox>
<br />
<asp:Button ID="btnCreateAccount" runat="server" Text="Signup" OnClientClick="HandleIT(); return false;" />
</div>
这是 web 方法,(这将位于您的 .aspx.vb 文件中):
Imports System.Web.Services
<WebMethod> _
Public Shared Function ProcessIT(name As String, address As String) As String
Dim result As String = (Convert.ToString((Convert.ToString("Welcome Mr. ") & name) + ". Your address is '") & address) + "'."
Return result
End Function
您可以为每个 sql 查询创建一个 webmethod,但即使如此,我也不认为您可以引用那些 SqlDataSource 对象。您将需要使用不同的方式通过 vb.net 提取数据,然后从 webmethod 返回该数据。
Webmethods 使用 JSON 发送和接收对象,这意味着它们会为您将对象序列化到 JSON 或从 JSON 反序列化。我发现最适合返回 javascript 的对象类型是 list(ofdictionary(of string, object))) 所以你的 JSON 看起来像这样:
[{"ID": 6, "Name":"sec0ndHand","StaffId" : "employeeOfTheMonth1"},{"ID": 3, "Name":"Tomy","StaffId" : "notEmployeeOfTheMonth1"}]
所以你的网络方法最终看起来像这样:
<WebMethod> _
Public Shared Function ProcessIT(name As String, address As String) As list(of dictionary(of string, object)))
Dim result As list(of dictionary(of string, object))) = New list(of dictionary(of string, object)))
'get/update/delete/insert your data
'convert your return object into list(of dictionary(of string, object)))
Return result
End Function
感谢您的回答。后来我找到了一种更直接的方法,看起来更简单,并且似乎适合我的情况。
我只是在更新事件上添加参数:
Protected Sub SQL_Update(source As Object, e As SqlDataSourceCommandEventArgs) Handles SqlDataSource.Updating
dim staffid as string = newname.valie
// presudo for other passing values
e.Command.Parameters("@StaffID").Value = staffid
//and for other parameters
End Sub
然后可以在执行 SQL 更新之前添加这些自定义参数