Имя «URL» не существует в текущей ошибке контекста

У меня есть проект MVC4, для которого я пытаюсь создать помощника. Я добавил папку с именем «App_Code», и в эту папку я добавил файл с именем MyHelpers.cshtml. Вот все содержимое этого файла:

@helper MakeButton(string linkText, string actionName, string controllerName, string iconName, string classes) {
    <a href='@Url.Action(linkText,actionName,controllerName)' class="btn @classes">Primary link</a>
}

(Я знаю, что есть некоторые неиспользуемые параметры, я вернусь к ним позже, когда исправлю это)

Я «почистил» и построил решение, ошибок нет.

На странице, которая использует хелпер, я добавил этот код.

@MyHelpers.MakeButton("Back","CreateOffer","Merchant","","btn-primary")

Когда я пытаюсь запустить проект, я получаю следующую ошибку:

Сообщение об ошибке компилятора: CS0103: имя «URL» не существует в текущем контексте

Я не могу найти правильный способ написать это - что я делаю неправильно? Это кажется правильным по сравнению с примерами, которые я видел в Интернете?


person Todd Davis    schedule 06.06.2013    source источник
comment
Я думаю, вам нужно сделать что-то вроде этого: stackoverflow.com/questions/4710853/.   -  person JeffB    schedule 06.06.2013
comment
Вы хотели использовать @Html.ActionLink вместо @Url.Action? Я сделал сноску в своем ответе о двух.   -  person Andy Brown    schedule 06.06.2013


Ответы (2)


Как следует из ссылки JeffB, ваш вспомогательный файл не имеет доступа к объекту UrlHelper.

Это пример исправления:

@helper MakeButton(string linkText, string actionName,
    string controllerName, string iconName, string classes) {

    System.Web.Mvc.UrlHelper urlHelper =
        new System.Web.Mvc.UrlHelper(Request.RequestContext);
    <a href='@urlHelper.Action(linkText,actionName,controllerName)'
        class="btn @classes">Primary link</a>
}
person Rowan Freeman    schedule 06.06.2013

Для своих помощников я создаю базовый класс:

using System.Web.WebPages;
using System.Web.Mvc;

namespace MyProject
{
    public class HelperBase : HelperPage
    {
        public static new HtmlHelper Html
        {
            get { return ((WebViewPage)WebPageContext.Current.Page).Html; }
        }
        public static System.Web.Mvc.UrlHelper Url
        {
            get { return ((WebViewPage)WebPageContext.Current.Page).Url; }
        }
    }
}

И затем в моем помощнике я делаю (используя ваш в качестве примера):

@inherits MyProject.HelperBase
@using System.Web.Mvc
@using System.Web.Mvc.Html

@helper MakeButton(string linkText, string actionName, string controllerName, string iconName, string classes) {
    <a href='@Html.ActionLink(linkText,actionName,controllerName)' class="btn @classes">Primary link</a>
}

Кроме того, вы уверены, что не хотели использовать @Html.ActionLink (через LinkExtensions) вместо @Url.Action? У последнего, похоже, нет перегрузки linkText, actionName, controllerName, а у первого есть?

person Andy Brown    schedule 06.06.2013
comment
Ваш базовый класс великолепен! Сделал именно то, что мне было нужно, спасибо. - person Dan Bechard; 03.12.2015
comment
Да, идеально, именно то, что я искал! - person cuzzlor; 14.12.2015