Как получить доступ к свойствам расширений в представлении в Asp.Net MVC?

У меня есть настройка проекта MVC 4 с использованием проверки подлинности с помощью форм и SimpleMembershipProvider. В моей таблице пользователей у меня есть некоторые другие свойства, такие как электронная почта, имя, фамилия и т. д.

Как получить доступ к текущему профилю пользователя, вошедшего в систему, в представлении Razor?

Я попытался создать BaseController, а затем наследовать от него другие контроллеры, например.

   public class BaseController : Controller
    {
        public UserProfile CurrentUser;

        protected override void Initialize(RequestContext requestContext)
        {
            base.Initialize(requestContext);

            if (this.HttpContext.User.Identity.IsAuthenticated)
            {
                var context = new UsersContext();
                var user = context.UserProfiles.SingleOrDefault(u => u.UserName == WebSecurity.CurrentUserName);
                CurrentUser = user;
            }
        }
    }

Затем в методе HtmlExtension;

public static class HtmlExtensions
    {
        public static UserProfile CurrentUser(this HtmlHelper htmlHelper)
        {
            var controller = htmlHelper.ViewContext.Controller as BaseController;
            if (controller == null)
            {
                throw new Exception("The controller used to render this view doesn't inherit from BaseController");
            }
            return controller.CurrentUser;
        }
    }

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

@Html.CurrentUser.Firstname

person sparkymark75    schedule 05.07.2013    source источник


Ответы (1)


Вы должны установить namespace вашего класса HtmlExtensions в тегах system.web.webPages.razor -> pages -> namespace, чтобы он был доступен в представлении, в файле web.config внутри папки Views, например:

<system.web.webPages.razor>
    <!-- other tags -- >
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="System.Configuration" />
        <add namespace="MyWebApplication.Extensions"/> <!-- this is a custom namespace -->
      </namespaces>
    </pages>
  </system.web.webPages.razor>

Я также рекомендую использовать GlobalFilter для заполнения свойства CurrentUser.

person Felipe Oriani    schedule 05.07.2013
comment
Спасибо, я сделал это, но я получаю ссылку на объект, не установленную на экземпляр ошибки объекта при использовании @Html.CurrentUser().Firstname в моем представлении _Layout.cshtml. - person sparkymark75; 06.07.2013
comment
В этом случае CurrentUser имеет значение null, убедитесь, что ваше представление было возвращено контроллером, унаследованным от BaseController. Смотрите мои правки. - person Felipe Oriani; 06.07.2013