Подтвердить что ты не робот

ASP MVC Razor рассматривает методы расширения, как создавать "глобальные" методы просмотра?

Я использую представление Razor с предварительным просмотром asp mvc 3

Я пытаюсь создать некоторые методы, которые я хотел бы получить непосредственно в представлениях. Это не Html-помощники, поэтому я не думаю, что расширение HtmlHelper имеет смысл?

моя цель, иметь возможность вызывать методы в представлении i.e.

@HelloWorld(); vs @Html.HelloWorld()

Я могу заставить Html.HelloWorld работать, создав метод расширения на HtmlHelper

public static class HtmlExtensions
{
    public static string HelloWorld(this HtmlHelper helper)
    {
        return "Hello";
    }
}

Я хотел бы сделать то же самое, но для представления; моя проблема - какой тип объекта является видом?

Примечание. Мне удалось заставить это работать, указав методы на странице .cshtml

@functions 
{
    public string HelloWorld()
    {
        return "Hello";
    }
}

@HelloWorld() @* now this works *@

то я попытался поместить этот код в свой файл _viewstart.cshtml, думая, что он будет доступен во всех представлениях, но это не было

Если бы я знал, какой тип представления я думаю, он может быть легко расширен, любая помощь оценена

4b9b3361

Ответ 1

Оказывается, среда выполнения asp будет определять метод Execute во время выполнения, поэтому базовый класс пользовательского представления также должен быть абстрактным

using System;
using System.Web.Mvc;

namespace MyMvcWebApp.Extensions
{
    public abstract class ViewBase<TModel>
        : System.Web.Mvc.WebViewPage<TModel> where TModel : class
    {
        // now this will be available in any view @HelloWorld()
        public string HelloWorld()
        {
            return "Hello from the ViewBase class";
        }
    }
}

это должно работать с строго типизированными представлениями, похоже, что с бритвой все виды сильно набраны, когда вы не определяете тип "dynamic", и это сильный тип

также как и Clicktricity, вы затем обновляете файл web.config(тот, который находится в каталоге представлений)

<pages pageBaseType="MyMvcWebApp.Extensions.ViewBase">

Ответ 2

Как отмечают другие, Razor Views все в конечном итоге наследуют от WebViewPage:

public abstract class WebViewPage<TModel> : WebViewPage

Поэтому вы можете просто написать свои методы расширения для WebViewPage без создания нового базового класса или изменения файлов конфигурации, что было предложено другими ответами. Например:

public static class WebViewPageExtensions
{
    public static string HollowWorld(this WebViewPage wvp)
    {
        return "Memento mori";
    }
}

Добавьте к вашему представлению оператор using для этого пространства имен, а затем:

<p>@this.HollowWorld()</p>

Ответ 3

Базовый класс по умолчанию для представлений Razor указан в Web.config, расположенном в каталоге представлений. Обычно это:

<pages pageBaseType="System.Web.Mvc.WebViewPage">

Я не пробовал, но я бы предложил наследовать этот базовый класс и добавить свои собственные функции, а затем настроить web.config соответственно.

Ответ 4

Лучший способ вызова метода с аргументами с помощью механизма бритвы - использовать помощники. Пример: пусть у вас есть помощник @MakeNote (строковое содержимое)

Затем на странице cshtml вам просто нужно вызвать @MakeNote ( "Привет" ), и все должно быть хорошо.

Я сошел с ума, когда у меня возникла проблема, и Google отправил меня на эту страницу, но это не помогло. Я пытался загрузить контент в html <select> с помощью L2E с помощью бритвы.

Секрет состоит в том, чтобы создать помощника в app_code, затем использовать с cshtml.