Получить текущего пользователя в asp.NET MVC, чтобы я мог проверить, что делать в элементах управления пользователя - PullRequest
2 голосов
/ 12 июня 2009

Я использую ASP.NET MVC для проекта. Я использую много пользовательского контроля, и мне нужно проверить текущего пользователя и проверить, есть ли у него роли и т. Д., Теперь я создаю пользователя в каждом пользовательском контроле, который я вижу. Я хочу изменить это, поэтому я создаю это только один раз.

Вопрос в том, что это лучший апроч? viewData ["User"] = пользователь и получить форму пользователя здесь или что? что вы рекомендуете, чтобы я мог избавиться от этих строк

 LCP.eTorneos.Dal.EntityFramework.JugadorRepository jugadorRepository =
                   new LCP.eTorneos.Dal.EntityFramework.JugadorRepository();
 var jugador = jugadorRepository.GetJugador(User.Identity.Name)
 <% if (Page.User.Identity.IsAuthenticated && jugador.IsAdmin) { %>
      ...
 <%}%>

Ответы [ 3 ]

3 голосов
/ 12 июня 2009

Есть 2 варианта. Во-первых, использование ViewData ["User"] - самое простое, но не лучшее (не строго типизированное). Во-вторых (если вы используете модели вида), используйте модель базового вида для всех ваших моделей вида:

public class BaseViewModel {
    public Jugador Jugador;

    // Or simply add flag

    public IsAdmin;
}

public class ConcreteViewModel : BaseViewModel {
    public YourModel Model;
}

В контроллере:

var model = new ConcreteViewModel {
    Model = yourModel,
    IsAdmin = true /* false */
};

return View(model);

В просмотрах:

<%@ Page MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ConcreteViewModel>" %>

<!-- Or in SiteMaster: -->

<%@ Master Inherits="System.Web.Mvc.ViewMasterPage<BaseViewModel>" %>

<% if(Model.IsAdmin) { %>

...

<% } %>

ОБНОВЛЕНИЕ:

Лучше избегать дублирования кода и настроить базовую часть ViewModel с помощью пользовательского фильтра:

public class IsAdminAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // ...

        (filterContext.Controller.ViewData.Model as BaseViewModel).IsAdmin = true; /* flase */
    }
}
1 голос
/ 12 июня 2009

Я считаю, что-то вроде этого:

<%= Utils.GetJugador(ViewData).IsAdmin %>

намного лучше, чем это:

<%= Html.GetJugador().IsAdmin %>

потому что расширения HtmlHelper предназначены только для генерации разметки HTML

UPDATE:

using System.Web.Mvc;
using LCP.eTorneos.Dal.EntityFramework;

public static class Utils {
    public static Jugador GetJugador(ViewDataDictionary ViewData) {
        return ViewData["JugadorActual"] as Jugador;
        /* OR maybe ?
         * return (Jugador)(ViewData["JugadorActual"] ?? new Jugador());
         */
    }
}

Надеюсь, это поможет

1 голос
/ 12 июня 2009

Прежде всего, спасибо @ eu-ge-ne.

Это то, что я сделал, я открыт для новых предложений, но, похоже, это работает: Я создаю атрибут ActionFilterAttribute следующим образом:

 public class JugadorAttribute : ActionFilterAttribute {
    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        JugadorRepository jugadorRepository = new JugadorRepository();
        Jugador jug = jugadorRepository.GetJugador(filterContext.HttpContext.User.Identity.Name);
        filterContext.Controller.ViewData["JugadorActual"] = jug; 
    }
}

Это помещает в ViewData текущий проигрыватель страницы. Затем в моем контроллере я делаю это:

 [JugadorAttribute()]
public class HomeController : Controller {

Проблема теперь в том, что ViewData не является строго типизированным, поэтому я создаю этот помощник в классе Html:

 public static class JugadorHelper {
    public static Jugador GetJugador(this HtmlHelper html) {
        return ((LCP.eTorneos.Dal.EntityFramework.Jugador)html.ViewData["JugadorActual"]);
    }
}

И вот, теперь я могу сделать это в моих взглядах:

Html.GetJugador().IsAdmin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...