Создание экземпляра класса помощника типа UrlHelper для каждого запроса? - PullRequest
0 голосов
/ 22 февраля 2012

Я хотел бы создать вспомогательный класс, который похож на класс UrlHelper в том смысле, что он требует, чтобы экземпляр класса был доступен для представлений, но я не могу на всю жизнь работать там, где создается экземпляр UrlHelper. доступно в виде @Url, как я хотел бы сделать то же самое.

Может ли кто-нибудь меня просветить?

Ответы [ 4 ]

4 голосов
/ 22 февраля 2012

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

Попробуйте создать новый класс, который расширяет System.Web.Mvc.ViewPage. У меня нет источника MVC на этом компьютере, поэтому я не могу точно сказать, как среда создает этот экземпляр для представлений, но вы можете изменить базовый тип страницы в вашем Web.config, чтобы создать MVC экземпляры вашего нового типа, а не его собственного типа.

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

Вам также необходимо создать универсальный тип для этого типа: Your.New.Page.Type<T> и объявить его как тип в вашем представлении (я не совсем уверен, как это делается в Razor):

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="Youre.New.Page.Type" %>

Вероятно, я скучаю по куче вещей.

См. Атрибут pageBaseType:

<configuration>
  <system.web>

    <pages
        validateRequest="false"
        pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        pageBaseType="Your.New.Page.Type, Your.New"
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    </pages>
  </system.web>
</configuration>
3 голосов
/ 22 февраля 2012

UrlHelper контроллера устанавливается в самой среде MVC.Добавление другого свойства уровня объекта в контроллер, доступный в представлениях, потребует взлома инфраструктуры (если я ошибаюсь, дайте мне знать).

Как правило, лучше создать метод расширения, который возвращает объектВы хотите, по вашему мнению.Например:

public static class UrlHelperExtensions
{
    public static MyObjectType GetMyObject(this UrlHelper urlHelper)
    {
        return new MyObjectType();
    }
}

Чтобы использовать GetMyObject(), например: @Url.GetMyObject(), вам необходимо включить пространство имен, в котором объявлен метод расширения, в ваш файл Web.config:

<namespaces>
    <!-- other namespaces will be here -->
    <add namespace="My.Namespace" />
</namespaces>

Обновление: В ответ на ваш комментарий рассмотрите возможность добавления в модель не относящихся к конкретным функциям функций:

@Model.MyObject.GetSomeProperty()
1 голос
/ 22 февраля 2012

Создайте своего помощника так:

public static class Extensions
{
    public static string SomeUrl(this UrlHelper urlHelper)
    {
        return "someUrl";
    }
}

И, на ваш взгляд, вы можете сослаться на это так:

@Url.SomeUrl()

Если они находятся в разных пространствах имен, вы должны иметь это в верхней части вашего представления:

@using YourContainingExtNameSpace

EDIT

Если вы не хотите расширять класс UrlHelper, вы можете создать отдельный класс, подобный этому:

public class UrlGenerator
{
    public string MakeUrl()
    {
        return "someUrl";
    }
}

Пока у вас есть эта ссылка в вашем View, вы можете вызывать этот метод следующим образом:

@{
    UrlGenerator ug = new UrlGenerator();
    ug.MakeUrl();
}
0 голосов
/ 22 февраля 2012

Единственное, о чем я могу думать, - это создать расширение в UrlHelper и реализовать там ваши потребности.

public static class UrlExtensions
{
    public static string CustomThingy(this UrlHelper urlHelper)
    {
        //Do your custom stuff in here and add extra parameters if you need them
        //For example some Func or Expression or more simpler a string
    }
}

Однако все еще остается вопрос: что бы вы хотели с ним сделать, потому что в некоторых случаях было бы проще написать AjaxExtension или HtmlExtension. Это было причиной моего первоначального комментария на ваш вопрос. Все они предоставляют вам доступ к различным понятиям.

public static class HtmlExtensions
{
    public static string CustomThingy(this HtmlHelper urlHelper)
    {

    }
}

public static class AjaxExtensions
{
    public static string CustomThingy(this AjaxHelper urlHelper)
    {

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