需要使用存储过程和控制参数将当前用户传递给gridview

问题描述 投票:0回答:1

我正在尝试为新登录的帐户创建方向。我有 Identity 默认填充到的

AspNetUsers
表,但我创建了使用用户名作为外键的
Roles
Accounts
表。基本上,如果我可以传递第一个变量,它应该返回 1 个用户记录,我可以让向导竞争加入,但这就是我得到的。

“/”应用程序中的服务器错误。

在 ControlParameter 'httpuser' 中找不到控件 'hdn_httpuser'。
描述:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:System.InvalidOperationException:无法在 ControlParameter“httpuser”中找到控件“hdn_httpuser”。

来源错误:

当前 Web 请求执行期间生成未处理的异常。有关异常来源和位置的信息可以使用下面的异常堆栈跟踪来识别。

堆栈跟踪:

[InvalidOperationException:在 ControlParameter 'httpuser' 中找不到控件 'hdn_httpuser'。]
System.Web.UI.WebControls.ControlParameter.Evaluate(HttpContext上下文,Control控制)+553
System.Web.UI.WebControls.Parameter.UpdateValue(HttpContext上下文,Control控件)+70
System.Web.UI.WebControls.ParameterCollection.UpdateValues(HttpContext上下文,Control控件)+137
System.Web.UI.WebControls.SqlDataSource.LoadCompleteEventHandler(对象发送者,EventArgs e)+59
System.EventHandler.Invoke(对象发送者,EventArgs e)+0
System.Web.UI.Page.OnLoadComplete(EventArgs e) +138
System.Web.UI.Page.ProcessRequestMain(布尔值includeStagesBeforeAsyncPoint,布尔值includeStagesAfterAsyncPoint)+5909

Codebehind aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WorldsStrongestProgrammer2024App
{
    public partial class Orientation : System.Web.UI.Page
    {
        // Inherited From Master

        // # User Checking Variables
        public Orientation()
        {
        }

        public string httpuser;

        public string GetHttpUser()
        { 
            var a = HttpContext.Current.User.Identity.Name.ToString();
            httpuser = a;

            return httpuser; 
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GetHttpUser();
            }

            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                GetHttpUser();
            }
        }
    }
}

网页aspx:

<asp:GridView runat="server" ID="gv_httpuser"> 
    <columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:TextBox ID="hdn_httpuser" runat="server" Value="<%: httpuser %>"/>
            </ItemTemplate>
        </asp:TemplateField>
    </columns>
</asp:GridView>

<asp:GridView runat="server" ID="gv_aspuser" DataSourceID="sql_aspuser" AutoGenerateColumns="true" DataKeyNames="HttpUser">
</asp:GridView>

<asp:SqlDataSource runat="server" ID="sql_aspuser" ConnectionString="<%$ ConnectionStrings:Documents_SQLConn %>" SelectCommand="sLoginWizardOrientation_Step1" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:ControlParameter controlID="hdn_httpuser" PropertyName="Text" Name="httpuser" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

我的 SQL Server 存储过程:

CREATE PROCEDURE sLoginWizardOrientation_Step1 
    (@httpuser varchar(max) = '%')
AS
    SELECT 
        [Id],
        [Hometown],
        [Email],
        [PhoneNumber],
        [UserName] AS HttpUser
    FROM 
        [db_a84118_maindocuments].[dbo].[AspNetUsers]
    WHERE 
        UserName = @httpuser
c# asp.net sql-server stored-procedures asp.net-identity
1个回答
0
投票

好吧,忽略您有一个与页面类同名的该页面类的公共方法吗?

我建议您转储网页上内嵌 SQL 数据源的使用。其原因是当 SqlDatasource“运行”时失去控制,更糟糕的是当您的后台代码运行以设置 SqlDatasoruce 使用的某些值/参数时(当 SqlDatasoruce 触发时您无法轻松控制)。

那么,您现在正在祈祷 sqldata 源何时运行,但在 GridView 尝试根据后面代码中的某些值使用 Sqldata 源之前,您的后面代码是否已运行?

因此,随着所有这些“自动魔法”的发生,最终结果是失去对网页上运行的控制。

简单的问题是,在几乎所有情况下,最好不要在标记中使用 sql 数据源。我经常使用向导来创建 gridview,这确实会在标记中生成 sql 数据源。然而,我接下来要做的就是删除 sql 数据源,并将该数据拉移到代码后面。

上述建议将拯救你世界的贫困和许多痛苦。因此,使用构建器和向导来提供帮助是可以的,但请删除由此类向导创建的 sql 数据源(至少如果您超越任何类型的“训练轮”代码)。

那么,即使使用构建器和向导来创建 GridView 也是如此吗? 我强烈建议转储并删除标记中放置的 sql 数据源。

如上所述,很难控制 sql 数据源何时触发,并且通常它会在后面的代码之前触发/运行。在你后面的代码中,你正在弄乱一些你“希望”在 Sqldata 源运行之前设置的值。

那么,后面的代码是用来设置一些参数的吗?您无法控制 sqldata 源的页面加载和运行何时发生。

解决方案:当您有来自代码隐藏的代码值和参数时,不要使用sql数据源。所以,这样的代码很可能还没有运行,但是 Sqldata 源已经被使用了!!!

好的,考虑到上述,那么我们的代码就变成这样了:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }


    void LoadGrid()
    {

        string sUser = HttpContext.Current.User.Identity.Name.ToString();

        SqlCommand cmdSQL = new SqlCommand("sLoginWizardOrientation_Step1");
        cmdSQL.CommandType = CommandType.StoredProcedure;
        cmdSQL.Parameters.Add("@httpuser", SqlDbType.NVarChar).Value = sUser;

        gv_aspuser.DataSource = General.MyRstP(cmdSQL);
        gv_aspuser.DataBind();  

    }

现在请注意我们如何 100% 控制 GridView 的数据拉取和设置。

当然,一遍又一遍地编写 SQL 和连接代码很快就会变得非常累人。因此,这个全局辅助例程相当有用。

public static DataTable MyRstP(SqlCommand cmdSQL)
{
    DataTable rstData = new DataTable();

    using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
    {
        using (cmdSQL)
        {
            cmdSQL.Connection = conn;
            conn.Open();
            rstData.Load(cmdSQL.ExecuteReader());
        }
    }
    return rstData;
}

通过上面我们可以100%控制何时拉取数据,以及100%控制设置参数。

只需记住删除 GridView 标记中的 SqlDatasource 设置即可。

© www.soinside.com 2019 - 2024. All rights reserved.