Как использовать текущее имя пользователя 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, таким образом, не требуя передачи текущего пользователя через хранимую процедуру.

Том

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