ASp.NET MVC 3.0 Ошибка при вызове вспомогательного html-метода расширения - PullRequest
3 голосов
/ 17 мая 2011

У меня есть такой метод расширения:

namespace System.Web.Mvc.Html
{
    public static class HtmlExtensions
    {
        public static T GetEnumValue<T>(this HtmlHelper helper, int value) where T : struct, IConvertible
        {
            return EnumHelper<T>.GetEnumValue(value);
        }
    }
}

Затем я вызываю этот метод в Razor View ( автозаполнение для этого метода работает, это видно в представлении ), но я получаю ошибку:

@Html.GetEnumValue<MyEnumHere>(1) //Getting error here

ошибка: Cannot convert method group 'GetEnumValue' to non-delegate type 'object'. Did you intend to invoke the method?

Если я пойду так - без ошибок во время компиляции:

Html.GetEnumValue<MyEnumHere>(1) //but in that case didnt get data to display.

Также не получаю ошибки во время компиляции, если ложь что

 @{
     Html.GetEnumValue<MyEnum>(1); //But then I am getting error during execution  
 }

ошибка: No overload for method 'Write' takes 0 arguments

Есть предложения?

Обновление 0.1 :

Получите это так:

var value = Html.GetEnumValue<MyEnum>(1);
    @value

все еще вопрос, почему в этом случае это не работает:

 @Html.GetEnumValue<MyEnumHere>(1)

Обновление 0,2

после того, как я обновил свой метод расширения, чтобы он возвратил IHtmlStirng, но он все еще не заработал:

@using MyTypes.Enumerators
@inherits MvcContrib.FluentHtml.ModelWebViewPage<MyModel>

@foreach (var thing in Model.Stuff)
{
    @Html.GetEnumValue<MyEnum>(thing.Id)
}

ошибка при выполнении :

'В блоке foreach отсутствует закрывающий символ "}". Убедитесь, что у вас есть соответствующий символ "}" для всех символов "{" в этом блоке, и что ни один из символов "}" не интерпретируется как разметка. '

<MyEnum> по какой-то причине интерпретируется как тег html (получение предупреждения: Предупреждение 1 Элемент "MyEnum" не был закрыт. Все элементы должны быть либо самозакрывающимися, либо иметь соответствующий конечный тег. ) а также я не могу перейти к своему методу расширения в этом случае, но если я удаляю @ из объявления (Html.GetEnumValue<MyEnum>(thing.Id)), чем я могу перемещаться по моему методу

1 Ответ

10 голосов
/ 17 мая 2011

Обычно помощники HTML должны возвращать строки или IHtmlString , потому что это то, для чего они используются (генерируйте короткие фрагменты HTML, которые вы повторно используете в своих представлениях).

Так что, может быть, вы хотите это:

public static IHtmlString GetEnumValue<T>(this HtmlHelper helper, int value) where T : struct, IConvertible
{
    return MvcHtmlString.Create(EnumHelper<T>.GetEnumValue(value).ToString());
}

и тогда, по вашему мнению, вы сможете вызывать его следующим образом (обратите внимание, что вам может понадобиться заключить его в скобки, если вы хотите использовать обобщенные значения, поскольку < и > обрабатываются Razor как специальные символы анализатор):

@(Html.GetEnumValue<MyEnumHere>(1))
...