我想将GridView
控件添加到由SqlDataSource
支持的其中一个视图中。的SelectCommand
查询被参数化的aspnet_Users.UserId
GUID为当前登录的用户,所以我需要一种方法来传递用户ID作为参数。
我看了How to utilize ASP.NET current user name in SqlParameter without code-behind并决定创建一个名为UserIdParameter
的自定义Parameter
:
namespace MyApp.Web
{
public class UserIdParameter : Parameter
{
public UserIdParameter(string name)
: base(name)
{
}
protected UserIdParameter(UserIdParameter parameter)
: base(parameter)
{
}
protected override Parameter Clone()
{
return new UserIdParameter(this);
}
protected override object Evaluate(HttpContext context, Control control)
{
return Membership.GetUser().ProviderUserKey;
}
}
}
在ASPX视图中,我添加了:
<%@ Register TagPrefix="my" Namespace="MyApp.Web" %>
在<%@ Page ... %>
行之后的行中以及:
<SelectParameters>
<my:UserIdParameter Name="UserId" />
</SelectParameters>
在asp:SqlDataSource
元素中。
不幸的是,我得到一个分析器错误(“此请求提供服务所需资源的分析过程中出现错误,请检查下列特定分析错误详细信息并适当地修改源文件。”)与红色以下突出显示:
<my:UserIdParameter Name="UserId" />
的Visual Web Developer 2010 Express的还通知我说,“元素‘UserIdParameter’不是一个已知的元素。如果没有在网站上的编译错误,或者在web.config文件丢失可能出现这种情况。”
我是否需要以某种方式修改Web.config
?如果没有,我需要做什么才能使用我的自定义UserIdParameter
参数?
答案 0 :(得分:2)
我弄明白了这个问题。自定义UserIdParameter
类需要位于单独的程序集中,并且需要一个无参数构造函数。
对我有用的步骤是:
添加以下课程:
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyApp.Web.UI.WebControls
{
public class UserIdParameter : Parameter
{
public UserIdParameter()
{
}
public UserIdParameter(UserIdParameter userIdParameter)
: base(userIdParameter)
{
}
protected override Parameter Clone()
{
return new UserIdParameter(this);
}
protected override object Evaluate(HttpContext context, Control control)
{
return Membership.GetUser().ProviderUserKey;
}
}
}
构建MyApp.Web.UI.WebControls程序集。从ASP.NET Web项目(在我的例子中名为MyApp.Web)中引用它。
添加到Web.config
:
<pages>
<controls>
<add tagPrefix="my" assembly="MyApp.Web.UI.WebControls" namespace="MyApp.Web.UI.WebControls"/>
</controls>
<!-- ... -->
</pages>
这会在站点范围内注册控件库。 (请注意,pages
元素位于system.web
元素中。)
在SelectParameters
的{{1}}元素中使用以下内容:
SqlDataSource
(无需<my:UserIdParameter Name="UserGuid" DbType="Guid" />
)
答案 1 :(得分:0)
为什么不在查询中使用带有参数的SQLDataSource?之后,我非常确定您可以告诉SQLDataSource参数@UserId等于会话变量。没有一个代码行的所有。全部在图形界面中。
答案 2 :(得分:0)
更简单的方法是使用“选择”事件。在这里,您可以添加自定义参数。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasource.selecting.aspx