如何使用SqlDataSource自定义参数

时间:2011-01-17 03:26:17

标签: asp.net sqldatasource asp.net-webcontrol

我想将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参数?

3 个答案:

答案 0 :(得分:2)

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

对我有用的步骤是:

  1. 创建一个新的ASP.NET Server Control项目并将其添加到当前解决方案中。 (我将这个新项目命名为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的{​​{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