Как использовать текущее имя пользователя ASP.NET в SqlParameter без кода
Как мне получить имя текущего пользователя, не используя его в выделенном фрагменте кода, просто используя теги сервера aspx?
В коде позади я могу просто сделать это:
Label4.Text = User.Identity.Name.ToString()
Но я пытаюсь сделать это без кода, как это:
<body>
<form id="form1" runat="server">
<div>
1. <asp:Label ID="Label1" runat="server" Text="<% User.Identity.Name %>"/><br />
2. <asp:Label ID="Label2" runat="server" Text="<%= User.Identity.Name %>"/><br />
3. <asp:Label ID="Label3" runat="server" Text="<%# User.Identity.Name %>"/><br />
4. <asp:Label ID="Label4" runat="server" Text="<%= Context.User.Identity.Name %>"/><br />
5. <asp:Label ID="Label5" runat="server" Text='<%# User.Identity.Name %>' /><br />
6. <span runat="server" ID="Span1"><%= User.Identity.Name %></span><br />
7. <asp:LoginName ID="LoginName1" runat="server" /><br />
8. <span><%# User.Identity.Name %></span><br />
9. <span><%= User.Identity.Name %></span><br />
10. <asp:Label ID="Label6" runat="server" Text='<%= User.Identity.Name %>' /><br />
</div>
</form>
</body>
Я получаю имя пользователя, отображаемое для строк 6, 7 и 9, но я действительно хочу установить для свойства элемента управления это значение, а не просто отображать его на экране.
Является ли это возможным?
Предыстория: я создавал быстрое приложение, перетаскивая элементы управления на странице, и оказалось, что я сделал это, имея только одну строку в коде позади страниц. В этой строке в качестве значения скрытого поля указывалось имя текущего пользователя при загрузке страницы, чтобы я мог передать значение этого элемента управления в качестве параметра sqlparameter. Поэтому я подумал, что, поскольку я собирался идти этим путем (много вещей в aspx, которых, возможно, не должно было быть), я должен постараться соответствовать этому. Я обычно так не делаю, но хотел на этот раз
11 ответов
В комментарии вы написали:
Кроме того, если бы я мог получить какое-либо значение элемента управления, установленное для этого имени пользователя, я мог бы тогда указать, что мой sqlparameter является параметром управления, и это привело бы меня туда, где я тоже должен быть.
Вы можете создать пользовательский тип параметра.
Начните с создания этого класса, либо в App_Code, либо в dll элемента управления ASP.NET Server:
namespace ParameterDemo {
public class LoginParameter : Parameter {
public LoginParameter(string name)
: base(name)
{}
protected override object Evaluate(HttpContext context, Control control)
{
//UPDATED as suggested in Joels comments below...
//return HttpContext.Current.User.Identity.Name;
return context.Current.User.Identity.Name;
}
}
}
и зарегистрировать его на странице (сразу после директивы @Page)
<%@ Register TagPrefix="put" Namespace="ParameterDemo" %>
(или опционально зарегистрируйте его в web.config для использования на всех страницах)
... и вы можете использовать его так:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
SelectCommand="SELECT * FROM MyTable WHERE SomeValue=@SomeParameter">
<SelectParameters>
<put:loginParameter name="SomeParameter" />
</SelectParameters>
</asp:ObjectDataSource>
Если это то, что вы ищете, вам следует рассмотреть возможность редактирования исходного вопроса...
Если вы действительно хотите передать текущее имя пользователя в качестве параметра выбора в SqlDataSource, я бы предложил создать быстрый настраиваемый параметр (либо в виде файла кода в вашем веб-проекте, либо, если хотите, в отдельной сборке):
namespace CustomParameters
{
public class UserNameParameter : Parameter
{
public UserNameParameter()
{
}
public UserNameParameter(string name)
: base(name)
{ }
protected override object Evaluate(HttpContext context, Control control)
{
return User.Identity.Name;
}
}
}
а затем на вашей странице:
<%@ Register TagPrefix="myNS" Namespace="CustomParameters" %>
...
<myNS:UserNameParameter Name="UserName" />
Вы действительно нуждаетесь в контроле над сервером этикеток? Или вы могли бы просто использовать теги span, отображаемые серверным элементом управления?
<span runat="server" ID="Label2"><%= User.Identity.Name %></span>
Обновить:
Хорошо, новая цель: получить User.Identity.Name
в значение SqlParameter без использования кода позади.
Это будет сложно. Основной код тега пчелиных укусов (<% %>
и т. п.) не запускаются в жизненном цикле страницы, пока ваш запрос не будет выполнен. Это означает, что вам нужно самостоятельно обрабатывать более раннее событие жизненного цикла страницы, а обычно это означает что-то в коде. Если вы действительно хотите избавиться от кода, вы можете, конечно, добавить серверный скрипт на своей странице:
<%@ Page Lanuage="C#" %>
<script runat="server" language="c#">
public void OnSelecting(object sender, SqlDataSourceSelectingEventArgs e)
{
e.Command.Parameters["@UserName"].Value = User.Identity.Name;
}
</scirpt>
<html>
<body>
<asp:SqlDataSource runat="server" ID="MyDataSource" OnSelecting="OnSelecting" ...>
<SelectParameters>
<asp:Parameter Name="UserName" ... />
</SelectParameters>
</asp:SqlDataSource>
<asp:GridView runat="server" ID="ResultsGrid" DataSourceID="MyDataSource" .../>
</body>
</html>
Тем не менее, он все еще пишет настоящий код, а не держит все в разметке. Но я подозреваю, что это самое близкое, что вы можете получить здесь.
Не используйте самозакрывающийся ярлык.
<asp:Label ID="UserNameLabel" runat="server" ><%= My.User.Name %></asp:Label>
Будет ли это сделать трюк?
<asp:LoginName ID="LoginName1" runat="server" />
Я не уверен в этом, но я думаю,
<asp:Label ID="Label1" runat="server" Text='<%# User.Identity.Name %>' />
Двойные кавычки не являются истинными для выражений, когда они определены в свойстве. Вместо использования вышеприведенного выражения вы можете также напечатать значение в некоторой html-метке, просто написав выражение, т.е.
<span><%# User.Identity.Name %></span>
И убедитесь, что вы аутентифицировали пользователя достаточно хорошо.
Одним из способов было бы установить его в коде:
Label1.Text = User.Identity.Name.ToString();
Другой способ - использовать построитель выражений, такой как CodeExpressionBuilder Рикардо Переса, для привязки свойства элемента управления из разметки aspx:
<asp:Label runat="server" Text="<%$ Code: User.Identity.Name.ToString() %> />
Вместо этого вы можете использовать параметр Profile:
<asp:ProfileParameter Name="SomeParameter" PropertyName="UserName" Type="String" />
<asp:Label ID="Label1" runat="server" Text='<%= User.Identity.Name %>' />
Проблема в двойных кавычках. Вам часто нужно будет использовать одинарные кавычки
Я подозреваю, что вы забыли вызвать DataBind() в вашей форме. Label3 или Label5 должны работать идеально.
Добавьте вызов к form1.Databind() в вашем Page_Load(), и это должно исправить это.
Некоторые возможные ответы выше, но другой возможный вариант - использовать проверку подлинности Windows на веб-сервере и отключить анонимный доступ. Пользователи Windows проходят аутентификацию автоматически, если веб-сайт настроен как локальная интрасеть.
В вашем соединении SQL используйте: Integrated Security=True
Важной частью является добавление следующего в web.config:
<system.web>
<identity impersonate="true" />
</system.web>
Без олицетворения в файле web.config ваши подключения к базе данных будут проходить проверку подлинности через пользователя, определенного в пуле приложений: IIS APPPOOL\ASP.NET v4
Затем внутри SQL вы можете использовать функцию CURRENT_USER для чтения User, таким образом, не требуя передачи текущего пользователя через хранимую процедуру.
Том