我正在尝试为新登录的帐户创建方向。我有 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
好吧,忽略您有一个与页面类同名的该页面类的公共方法吗?
我建议您转储网页上内嵌 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 设置即可。