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, думая, что он будет доступен во всех представлениях, но это не было
Если бы я знал, какой тип представления я думаю, он может быть легко расширен, любая помощь оценена
Ответы
Ответ 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.