Помогите с asp.net mvc и ViewData в MasterPage - PullRequest
1 голос
/ 04 августа 2010

Чтобы избежать необходимости передавать данные, которые идут на главной странице моего сайта, перед каждым просмотром в каждом контроллере, я создал ApplicationController, который устанавливает данные в своем конструкторе ... проблема с этим подходом заключается в том, что один из viewdatas, которые я должен передать, - это URL профиля. Изображение текущего пользователя, вошедшего в систему.

[Authorize(Roles = "Administrator")]
    public abstract class AdministratorController : Controller
    {
        private IPortalAdministratorServices _servicioPortalAdministrator;
        public AdministratorController()
        {
            _servicioPortalAdministrator = new PortalAdministratorServices();
            ViewData["associates"] = _servicioPortalAdministrator.getAssociates();
            ViewData["picture"] = _servicioPortalAdministrator.GetPic();        

        public AdministratorController(IPortalAdministratorServices service)
        {
            _servicioPortalAdministrator = service;
            }

    }

и поэтому контроллерам моей компании, которые наследуются от AdministratorController, теперь не нужно устанавливать все эти данные при каждом вызове просмотра.

[Authorize(Roles = "Administrator")]
public class CompaniesController : AdministratorController
{
    private ICompaniasServices _service;

    public CompaniesController()
    {
        _service = new CompaniasServices(new ModelStateWrapper(this.ModelState));

    }

    public CompaniesController(ICompaniasServices service)
    {
        _service = service;
    }

Проблема заключается в следующем:

Когда я пытаюсь получить доступ к контроллеру компаний вручную без фактического входа в метод GetPic (), на самом деле я не могу получить URL-адрес изображения, потому что никто не вошел в систему ... и этот метод вызывается несмотря на авторизацию атрибут .... так что теперь, даже после входа в ViewData для картинки URL был постоянно установлен в "unknown.png"

Часть этого кода не моя .. Я только что обнаружил ошибку, но не могу понять, как ее исправить.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2010
if (User.Identity.IsAuthenticated){
   ViewData["picture"] = _servicioPortalAdministrator.GetPic(); 
}
else{
   ...
}

Это то, что вы можете использовать?

0 голосов
/ 23 мая 2011

Удалите реализацию из конструктора, добавьте этот фильтр, и тогда ваше использование будет выглядеть следующим образом: [Authorize (Roles = "Administrator"), AdministratorServices].

public class AdministratorServicesAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var filter = new AdministratorServicesFilter(new PortalAdministratorServices());
            filter.OnActionExecuting(filterContext);
        }
    }

public class AdministratorServicesFilter : IActionFilter
{
    private readonly IPortalAdministratorServices  _servicioPortalAdministrator;

    public AdministratorServicesFilter(IPortalAdministratorServices servicioPortalAdministrator)
    {
        _servicioPortalAdministrator = servicioPortalAdministrator;
    }

    #region IActionFilter Members

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {

    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData["associates"] = _servicioPortalAdministrator.getAssociates();
        filterContext.Controller.ViewData["picture"] = _servicioPortalAdministrator.GetPic();
    }

    #endregion
}
0 голосов
/ 04 августа 2010

Работает ли Authorize где-нибудь на вашем сайте?Если нет, может быть, вы пропустили раздел в своем файле web.config?

...