Засада с asp.net mvc
От: seregaa Ниоткуда http://blogtani.ru
Дата: 11.04.10 07:05
Оценка:
Напоролся на засаду при указании inherits для страницы. Не получается указать базовый класс — генерик.

Использую синтаксис inherits="System.Web.Mvc.ViewPage.[MvcApplication7.Models.LogOnModel]", в ответ на котороый получаю ошибку парсера "тип не найден". Если указать тип в формате с#, то aspx парсер его проглатывает, но начинает ругаться компилятор немерле, поскольку это имя типа попадет в сгенерированный *.n файл в исходном виде.

Покопался в исходниках mvc, оказывается mvc хитрым образом обрабатывает атрибут inherits. Если mvc определяет, что в качестве базового класса используется генерик, то подменяет название базового класса на System.Web.Mvc.ViewPage, а исходное значение запоминает во внутренних структурах. Для определения генерика используется такая нехитрая функция:
private static bool IsGenericTypeString(string typeName)
{
    return (typeName.IndexOfAny(new char[] { '<', '(' }) >= 0);
}


видно, что Немерле с квадратными скобками тут пролетает .

Я пока вижу решение только в виде хака: указывать базовый тип в формате c#, а при генерации *.n файла подменять в названиях типов синтаксис шарпа на синтаксис немерле. Для этого нужно поправить метод NemerleCodeGenerator.GetTypeOutput
Но честно говоря мне такой способ совсем не нравится.

Сталкивался ли ктонибудь с этим и получилось ли найти решение?
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re: Засада с asp.net mvc
От: Ziaw Россия  
Дата: 11.04.10 07:14
Оценка:
Здравствуйте, seregaa, Вы писали:

S>Сталкивался ли ктонибудь с этим и получилось ли найти решение?

Я сталкивался. Пришел к решению о замене ViewEngine. Впрочем наверное можно просто подшаманить стандартый от MVC.
... << RSDN@Home 1.2.0 alpha 4 rev. 1468>>
Re: Засада с asp.net mvc
От: seregaa Ниоткуда http://blogtani.ru
Дата: 11.04.10 07:38
Оценка: :)
Здравствуйте, seregaa, Вы писали:

S>Напоролся на засаду при указании inherits для страницы. Не получается указать базовый класс — генерик.


S>Использую синтаксис inherits="System.Web.Mvc.ViewPage.[MvcApplication7.Models.LogOnModel]", в ответ на котороый получаю ошибку парсера "тип не найден". Если указать тип в формате с#, то aspx парсер его проглатывает, но начинает ругаться компилятор немерле, поскольку это имя типа попадет в сгенерированный *.n файл в исходном виде.


Ха, обманул mvc ) Если имя типа взять в круглые скобки то его проглотит и mvc и компилятор немерле )
Inherits="(System.Web.Mvc.ViewPage.[MvcApplication7.Models.LogOnModel])"
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[2]: Засада с asp.net mvc
От: seregaa Ниоткуда http://blogtani.ru
Дата: 11.04.10 07:47
Оценка:
Здравствуйте, Ziaw, Вы писали:

S>>Сталкивался ли ктонибудь с этим и получилось ли найти решение?

Z>Я сталкивался. Пришел к решению о замене ViewEngine. Впрочем наверное можно просто подшаманить стандартый от MVC.

Да, нашелся способ и подшаманить. Нужно написать свою версию ViewTypeParserFilter, взяв исходный класс за базовый, и прописать в web.config вместо ViewTypeParserFilter свой класс. Но пока наверное остановлюсь на обходном варианте (см. мое второе сообщение) с заключением имени типа в скобки.
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re: Засада с asp.net mvc
От: seregaa Ниоткуда http://blogtani.ru
Дата: 11.04.10 08:06
Оценка: 12 (1)
Здравствуйте, seregaa, Вы писали:

Кстати, напоминание для использующих немеле и asp.net mvc проект — не забывайте подключать к пректу макросборку Nemerle.Linq, в противном случае синтаксис конструирования выражений (expression) работать не будет. Я имею ввиду выражения вида Html.TextBoxFor(m => m.UserName).
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.