【问题标题】:Changing read-only field value with method使用方法更改只读字段值
【发布时间】:2012-11-07 05:41:36
【问题描述】:

我在 ASP.Net webapp 中有一个工作的 GridView,它跟踪我请求的 DNS 记录。定义如下:

<asp:GridView ID="gvExistingEntries" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="DNSId" DataSourceID="dsDNS" Width="100%" 
    BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" 
    CellPadding="4" ForeColor="Black" GridLines="Vertical" AllowSorting="True" ShowFooter="true">
    <AlternatingRowStyle BackColor="White" />
    <Columns>
        <asp:BoundField DataField="DNSId" Visible="false" ReadOnly="true" />
        <asp:BoundField DataField="DNSName" HeaderText="DNS Name" SortExpression="DNSName" />
        <asp:BoundField DataField="IPAddress" HeaderText="IP Address" ReadOnly="True" SortExpression="IPAddress" />
        <asp:BoundField DataField="RecordType" HeaderText="Record Type" SortExpression="RecordType" />
        <asp:BoundField DataField="RequestTicket" HeaderText="Request Ticket" SortExpression="RequestTicket" />
        <asp:BoundField DataField="LastUpdateBy" HeaderText="Updated By" ReadOnly="True" SortExpression="LastUpdateBy" />

        <asp:TemplateField ShowHeader="false" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:LinkButton ID="updateButton" runat="server" CommandName="Edit" Text="Update" />
                <asp:LinkButton ID="deleteButton" runat="server" CommandName="Delete" Text="Delete" onClientClick="return confirm('Are you sure you want to delete this entry?');" />
            </ItemTemplate>

            <EditItemTemplate>
                <asp:LinkButton ID="saveUpdate" runat="server" CommandName="Update" Text="Save" onClientClick="return confirm('Are you sure you want to save these changes?');" />
                <asp:LinkButton ID="cancelUpdate" runat="server" CommandName="Cancel" Text="Cancel" />
            </EditItemTemplate>
        </asp:TemplateField>
    </Columns>
    <FooterStyle BackColor="#CCCC99" />
    <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
    <RowStyle BackColor="#F7F7DE" />
    <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
    <SortedAscendingCellStyle BackColor="#FBFBF2" />
    <SortedAscendingHeaderStyle BackColor="#848384" />
    <SortedDescendingCellStyle BackColor="#EAEAD3" />
    <SortedDescendingHeaderStyle BackColor="#575357" />
</asp:GridView>

数据源定义如下:

<asp:SqlDataSource ID="dsDNS" runat="server" 
    ConnectionString="<%$ ConnectionStrings:DNSMonConnectionString %>" 
    SelectCommand="SELECT [DNSId], [DNSName], [RecordType], [StartValidityDate], [EndValidityDate], [IPAddress], [LastUpdate], [RequestTicket], (select [FirstName] + ' ' + [LastName] + ' (' + [Login] + ')' FROM [User] where [User].[UserID] = [DomainName].[LastUpdateBy]) AS [LastUpdateBy] FROM [DomainName] ORDER BY [DNSName]"

    UpdateCommandType="StoredProcedure"
    UpdateCommand="sp_update_DNSEntry" OnUpdating
    DeleteCommandType="StoredProcedure"
    DeleteCommand="sp_drop_DNSEntry">
    <DeleteParameters>
        <asp:Parameter Name="DNSId" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="DNSId" />
        <asp:Parameter Name="DNSName" />
        <asp:Parameter Name="RecordType" />
        <asp:Parameter Name="IPAddress" />
        <asp:Parameter Name="RequestTicket" />
    </UpdateParameters>
</asp:SqlDataSource>

每当用户使用更新功能时,它都会起作用并将其保存到数据库中,但我希望代码在保存之前解析 IP 地址。我已经准备好执行此操作的方法,但我不知道如何将其合并到代码中。

如果可能,我宁愿避免将代码放在数据库中。

【问题讨论】:

    标签: c# asp.net .net gridview


    【解决方案1】:

    您可以在更新前使用OnUpdating 事件更新IP 地址。

    <asp:SqlDataSource OnUpdating="OnSqlUpdating"
        ... etc />
    

    在处理程序代码中,从 SqlDataSourceCommandEventArgs 中获取Command 属性,并更新相应的参数。

    private void OnSqlUpdating(Object source, SqlDataSourceCommandEventArgs e) 
    {
        DbCommand command = e.Command;
        command.Parameters["IPAddress"] = Request.UserHostAddress;
    }
    

    【讨论】:

    • 谢谢@dbaseman。你是说在 GridView 进行更新之前,我还要为 IP 地址发布另一个更新?这是否意味着基本上将在数据库中触发两个更新 sql 查询?不过,更新并未显示为选项。我看到的只是 UpdateCommandType(目前设置为 StoredProcedure)和 UpdateCommand,它设置为存储过程名称。
    • @flipcode 不,只有一个 SQL 查询。 OnSqlUpdating 事件是一个钩子,可让您在将参数发送到数据库之前检查和修改参数。
    • 我不认为更新是公共财产。我收到此编译错误:类型“System.Web.UI.WebControls.SqlDataSource”没有名为“更新”的公共属性。
    • 感谢您的反馈。我实际上解决了这个问题,但现在我得到了这个:编译器错误消息:CS1061:'ASP.dns_aspx'不包含'OnSqlUpdating'的定义,并且没有扩展方法'OnSqlUpdating'接受'ASP类型的第一个参数.dns_aspx' 可以找到(您是否缺少 using 指令或程序集引用?)
    • 好的,所以我不得不把它改成dbCmd.Parameters["@IPAddress"].Value = sIPAddresses;
    【解决方案2】:

    对于任何感兴趣的人,实现此目的的代码是:

    <asp:SqlDataSource ID="dsDNS" runat="server" OnUpdating="OnSqlUpdating" ... />
    
    protected void OnSqlUpdating(Object source, SqlDataSourceCommandEventArgs e)
    {
        string sIPAddresses = "";
    
        // Custom code here to look up IP addresses.
    
        DbCommand dbCmd = e.Command;
        dbCmd.Parameters["@IPAddress"].Value = sIPAddresses;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2020-05-11
      相关资源
      最近更新 更多