Как использовать пользовательский параметр с 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
Класс должен быть в отдельной сборке, и ему нужен конструктор без аргументов.
Шаги, которые работали для меня были:
- Создайте новый проект ASP.NET Server Control и добавьте его в текущее решение. (Я назвал этот новый проект MyApp.Web.UI.WebControls).
Добавьте следующий класс:
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 (в моем случае называется 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
элемент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