Как использовать пользовательский параметр с SqlDataSource

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

Я прочитал, как использовать текущее имя пользователя 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 ответа

Решение

Я понял проблему. Обычай 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 ... %>)

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

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

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

Другие вопросы по тегам