1

我想向GridView我的一个视图添加一个由SqlDataSource. 该SelectCommand查询aspnet_Users.UserId在当前登录用户的 GUID 上进行了参数化,因此我需要一种将用户 ID 作为参数传递的方法。

我阅读了如何在没有代码隐藏的情况下在 SqlParameter 中使用 ASP.NET 当前用户名,并决定创建一个自定义Parameter名称UserIdParameter

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参数?

4

3 回答 3

2

我解决了这个问题。自定义UserIdParameter类需要位于单独的程序集中,并且需要一个无参数构造函数。

对我有用的步骤是:

  1. 创建一个新的 ASP.NET 服务器控件项目并将其添加到当前解决方案中。(我将这个新项目命名为 MyApp.Web.UI.WebControls)。
  2. 添加以下类:

    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;
            }
        }
    }
    
  3. 构建 MyApp.Web.UI.WebControls 程序集。从 ASP.NET Web 项目(在我的例子中名为 MyApp.Web)中引用它。

  4. 添加到Web.config

    <pages>
          <controls>
            <add tagPrefix="my" assembly="MyApp.Web.UI.WebControls" namespace="MyApp.Web.UI.WebControls"/>
          </controls>
          <!-- ... -->
    </pages>
    

    这会在站点范围内注册控件库。(注意pages元素在system.web元素之内。)

  5. SelectParameters在 的元素中使用以下内容SqlDataSource

    <my:UserIdParameter Name="UserGuid" DbType="Guid" />
    

    (不需要<%@ Register ... %>

于 2011-01-18T18:49:06.153 回答
0

为什么不使用 SQLDataSource 和查询中的参数?之后,我很确定您可以告诉 SQLDataSource 参数 @UserId 等于会话变量。所有这一切都没有一行代码。全部在图形界面中。

于 2011-01-17T18:17:30.023 回答
0

更简单的方法是使用“选择”事件。在这里您可以添加您的自定义参数。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasource.selecting.aspx

于 2012-05-04T13:31:49.603 回答