Как использовать пользовательский параметр с SqlDataSource - PullRequest
1 голос
/ 17 января 2011

Я хочу добавить GridView элемент управления к одному из моих видов, который поддерживается SqlDataSource. Запрос SelectCommand параметризован по GUID aspnet_Users.UserId для текущего пользователя, вошедшего в систему, поэтому мне нужен способ передать идентификатор пользователя в качестве параметра.

Я прочитал Как использовать текущее имя пользователя ASP.NET в SqlParameter без кода и решил создать пользовательский 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?

Ответы [ 3 ]

2 голосов
/ 18 января 2011

Я разобрался в проблеме. Пользовательский класс 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 (в моем случае 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 ... %>)

0 голосов
/ 04 мая 2012

Более простой способ - использовать событие «Выбор».здесь вы можете добавить свой пользовательский параметр.

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

0 голосов
/ 17 января 2011

Почему вы не использовали SQLDataSource с параметрами в вашем запросе?после этого я почти уверен, что вы можете сообщить SQLDataSource, что параметр @UserId равен переменной сеанса.все это без одной строки кода.все в графическом интерфейсе.

...