Modifying edited field of a DetailsView before inserting it to database when in "insert mode"

StackOverflow https://stackoverflow.com/questions/20105532

سؤال

On one of my final year project page I have a DetailsView that I am using to update/edit a GridView.

I have a password field that must show the hashed password.

When I am in "edit" or "insert" mode in the DetailsView and inserting a new password in the field (or editing the field) I would like to hash directly the password before showing it in the GridView/DetailsView and of course before inserting/updating it in the DataBase.

My GridView & DetailsView are both in the same UpdatePanel and I am using a ObjectDataSource.

That a partial code:

<asp:DetailsView ID="DetailsViewSingleUsr" runat="server" Height="50px" 
        Width="125px" DataSourceID="SingleUserObjectDataSource" DataKeyNames="id" 
            onitemdeleted="DetailsViewSingleUsr_ItemDeleted" 
            oniteminserted="DetailsViewSingleUsr_ItemInserted" 
            onitemupdated="DetailsViewSingleUsr_ItemUpdated" AutoGenerateRows="False" 
            oniteminserting="DetailsViewSingleUsr_ItemInserting">
        <Fields>
            <asp:TemplateField HeaderText="User ID" InsertVisible="False" 
                SortExpression="id">
                <EditItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Eval("id") %>'></asp:Label>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label8" runat="server" Text='<%# Bind("id") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="UserName" SortExpression="username">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("username") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("username") %>'></asp:TextBox>
                    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
                        ControlToValidate="TextBox1" Display="Dynamic" 
                        ErrorMessage="Username may only contain alphanumeric characters" 
                        ValidationExpression="^[a-zA-Z0-9_]*$" SetFocusOnError="True"></asp:RegularExpressionValidator>
                    <asp:CustomValidator ID="CustomValidator1" runat="server" 
                        ErrorMessage="UserName already exist." SetFocusOnError="True" Display="Dynamic" 
                        ControlToValidate="TextBox1" onservervalidate="CustomValidator1_ServerValidate"></asp:CustomValidator>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("username") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="First Name" SortExpression="firstname">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("firstname") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("firstname") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("firstname") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Last Name" SortExpression="lastname">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("lastname") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("lastname") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("lastname") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Password" SortExpression="pass">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("pass") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("pass") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label5" runat="server" Text='<%# Bind("pass") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Last Score" SortExpression="currentScore">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("currentScore") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("currentScore") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label6" runat="server" Text='<%# Bind("currentScore") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Best Score" SortExpression="maxScore">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBox6" runat="server" Text='<%# Bind("maxScore") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox6" runat="server" Text='<%# Bind("maxScore") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label7" runat="server" Text='<%# Bind("maxScore") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField ShowHeader="False">
                <EditItemTemplate>
                    <asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="True" 
                        CommandName="Update" ImageUrl="~/images/update.png" />
                    &nbsp;<asp:ImageButton ID="ImageButton2" runat="server" CausesValidation="False" 
                        CommandName="Cancel" ImageUrl="~/images/cancel.png" />
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="True" 
                        CommandName="Insert" ImageUrl="~/images/insert.png" />
                    &nbsp;<asp:ImageButton ID="ImageButton2" runat="server" CausesValidation="False" 
                        CommandName="Cancel" ImageUrl="~/images/cancel.png" />
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="False" 
                        CommandName="Edit" ImageUrl="~/images/edit.png" />
                    &nbsp;<asp:ImageButton ID="ImageButton2" runat="server" CausesValidation="False" 
                        CommandName="New" ImageUrl="~/images/new.png"/>
                    &nbsp;<asp:ImageButton ID="ImageButton3" runat="server" CausesValidation="False" 
                        CommandName="Delete" ImageUrl="~/images/delete.png"/>
                </ItemTemplate>
                <ControlStyle Height="20px" Width="20px" />
            </asp:TemplateField>
        </Fields>
    </asp:DetailsView>

I am able to access the password textbox in the code behind in the "ItemInserting" Event with that code:

protected void DetailsViewSingleUsr_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
    DetailsView myDetailsView = (DetailsView)sender;
    if (myDetailsView.CurrentMode == DetailsViewMode.Insert)
    {
        Label9.Text = ((TextBox)myDetailsView.FindControl("TextBox4")).Text;

    }
}

But how can I modify? Am I on the right way? Any suggestions?

Thx a lot guys!

هل كانت مفيدة؟

المحلول

ListViewInsertEventArgs contains property Values, in which you can find all of inserting values, obtained from controls. You may just modify those data. For example

e.Values["password"] = "newpassword";

نصائح أخرى

Thanks! I've finally end up with this code:

protected void DetailsViewSingleUsr_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
    e.Values["pass"] = LoginSecurityLogic.Hash_Password_to_MD5(e.Values["pass"].ToString());
}

protected void DetailsViewSingleUsr_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
{
        e.NewValues["pass"] = LoginSecurityLogic.Hash_Password_to_MD5(e.NewValues["pass"].ToString());

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top