Здравствуйте, hardcase, Вы писали:
S>>Разве инициализация объектов в Немерле уже реализована?
H>Угу в библиотеке макросов его нет. _FRED_ недавно давал ссылку (я не нашел) на with макрос, который позволяет свойства инициализировать в таком духе: H>
H>def x = MyClass() with { A = a(), B = b() }
H>
H>Где A и B — мутабельные свойства/пропертя.
Хм, а почему здесь используются фигурные скобки (как в шарпе), а для анонимных классов — круглые (не как в шарпе)? Просто исторически так сложилось?
Имхо нужно до релиза первой версии Немерле прийти к единому знаменателю.
Здравствуйте, hardcase, Вы писали:
S>>Ну тогда и предложенный тобой вариант с генерацией модели с именем global::_N_Home_Index_Model тоже не сработает. Ведь типизация методов представления может начаться раньше, чем типизация экшена и тогда к моменту типизации представления класс модели еще не будет определен.
H>Нет, предложенный способ работать будет: aspx файл компилируется в отдельную сборку и proj (App_Code) к нему цепляется референсом, так что тут все чисто. Минус у него следующий: имя модели жестко связано с именем контроллера и представления. Если позволить задавать имя модели явно, то можно ликвидировать этот недостаток.
класс, остроумное в самом хорошем смысле этого слова решение!
С явным определением имени та же засада — у разработчика будет соблазн использовать его в той же сборке, где определяет это имя.
Если связывать имя модели не с названем экшена, а с названием целевого представления, то особых проблем с неявным названием модели я не вижу.
Здравствуйте, seregaa, Вы писали:
S>Здравствуйте, hardcase, Вы писали:
S>>>Разве инициализация объектов в Немерле уже реализована?
H>>Угу в библиотеке макросов его нет. _FRED_ недавно давал ссылку (я не нашел) на with макрос, который позволяет свойства инициализировать в таком духе: H>>
H>>def x = MyClass() with { A = a(), B = b() }
H>>
H>>Где A и B — мутабельные свойства/пропертя.
S>Хм, а почему здесь используются фигурные скобки (как в шарпе), а для анонимных классов — круглые (не как в шарпе)? Просто исторически так сложилось?
with там был определен как оператор: правым операндом у него выступал секвенс — блок кода. Эз-дезигнед.
Здравствуйте, seregaa, Вы писали:
H>>Угу в библиотеке макросов его нет. _FRED_ недавно давал ссылку (я не нашел) на with макрос, который позволяет свойства инициализировать в таком духе: H>>
H>>def x = MyClass() with { A = a(), B = b() }
H>>
H>>Где A и B — мутабельные свойства/пропертя.
S>Хм, а почему здесь используются фигурные скобки (как в шарпе), а для анонимных классов — круглые (не как в шарпе)? Просто исторически так сложилось?
S>Имхо нужно до релиза первой версии Немерле прийти к единому знаменателю.
В компиляторе есть ограничение. Или { x; y; } или (x, y,) (последние точка с запятой и запятая не обязательны).
Так что в макросе принципиально не может быть { x, y } или (x; y).
Это правило обрабатывается еще на стадии лексического разбора.
Кроме того запятые и точки с запятой не могут идти вне скобок.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>На сегодня можно просто возвращать кортежи: VD>
VD>[Record]
VD>class SomeViewModel
VD>{
VD> public Data : list[string * int];
VD>}
VD>...
VD>SomeViewModel(db.Doctors.GroupBy(d => d.Taxonomy).Select(g => (g.Key, g.Count)).NToList());
VD>
VD>Это рабочий код на немерле.
Я в курсе.
Только вот во вьюхе придется отличать Taxonomy от Count по индексу тупла. Достаточно добавить в него еще пять полей, чтобы понять, что подход тупиковый. Самое противное, что написать такую вьюху еще можно, но читать потом нереально.
Ты в коментариях к коммиту с шаблоном (http://code.google.com/p/nemerle/source/detail?r=8753) написал, что в шаблоне не хватает файла default.aspx. Но в шаблоне, поставляемом с MVC 2.0 этого файла тоже нет. Если у тебя установлены обе версии mvc (1 и 2) можешь сравнить поставляемые шаблоны, они лежат в папке Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplates\CSharp\Web\1033\
Да, без default.aspx при запуске проекта не на 7-ом IIS-е браузер вместо главной страницы показывает оглавление каталога, что не очень удобно. Зато 1в1 как в референсном шаблоне.
Но если общественность считает, что default.aspx нужна, то добавлю.
Здравствуйте, seregaa, Вы писали:
S>Здравствуйте, hardcase
S>Да, без default.aspx при запуске проекта не на 7-ом IIS-е браузер вместо главной страницы показывает оглавление каталога, что не очень удобно. Зато 1в1 как в референсном шаблоне.
S>Но если общественность считает, что default.aspx нужна, то добавлю.
Не только в IIS-е 7.0. В WebDev-сервере также листинг каталога, впрочим можно настроить и на урлу, но, имхо, добавить стоит.
Здравствуйте, seregaa, Вы писали:
S>Здравствуйте, hardcase, Вы писали:
S>>>Ну тогда и предложенный тобой вариант с генерацией модели с именем global::_N_Home_Index_Model тоже не сработает. Ведь типизация методов представления может начаться раньше, чем типизация экшена и тогда к моменту типизации представления класс модели еще не будет определен.
H>>Нет, предложенный способ работать будет: aspx файл компилируется в отдельную сборку и proj (App_Code) к нему цепляется референсом, так что тут все чисто. Минус у него следующий: имя модели жестко связано с именем контроллера и представления. Если позволить задавать имя модели явно, то можно ликвидировать этот недостаток.
S> класс, остроумное в самом хорошем смысле этого слова решение!
Собственно реализация этой идеи.
Макрос формирующий модель:
[HandleError]
public class HomeController : Controller
{
public Index() : ActionResult
{
model ( message = "Hello, world!" )
}
public Stub() : ActionResult
{
model ( message = "Another hello!" ) view "Index"
}
public About() : ActionResult
{
model ( description = "Put some text here!", time = DateTime.Now )
}
}
Синтаксис model () части аналогичен анонимным типам (правда, интеллисенс там пока отключен).
Макрос сейчас использует WebFormsViewEngine. Если указывается часть view "BlaBla", то эту бла-бла вьюху макрос будет искать в текущем проекте и если не найдет — скажет варнинг, если view не указано, используется имя метода и опять же производится поиск.
Добраться до модели из aspx файла можно используя макрос Model():
Здравствуйте, hardcase, Вы писали:
H>Кстати, почему-то не работает объявление переменных в asxp, так что покачто сказать: H>
H>def model = Model();
H>
H>покачто нельзя, жаль.
Хм, я проверял такой сценарий, он работал. Может дело в том, что у тебя Model — это макрос, а не тип?
Вот этот код точно компилится и отрабатывает внутри aspx файла:
<%
def date = DateTime();
Response.Write(date.ToString());
%>
Здравствуйте, seregaa, Вы писали:
S>Здравствуйте, hardcase, Вы писали:
H>>Кстати, почему-то не работает объявление переменных в asxp, так что покачто сказать: H>>
H>>def model = Model();
H>>
H>>покачто нельзя, жаль.
S>Хм, я проверял такой сценарий, он работал. Может дело в том, что у тебя Model — это макрос, а не тип? S>Вот этот код точно компилится и отрабатывает внутри aspx файла:
Это я балбес — у меня же синтаксический макрос со слова model начинается
Здравствуйте, Ziaw, Вы писали:
Z>Только вот во вьюхе придется отличать Taxonomy от Count по индексу тупла. Достаточно добавить в него еще пять полей, чтобы понять, что подход тупиковый. Самое противное, что написать такую вьюху еще можно, но читать потом нереально.
На самом деле на практике это не так.
Кортежи обычно используются с помощью декомпозиции:
def (x, y, z) = f();
так что читать такой код будет очень даже комфортно, при условии, что имена даны разумные. Ты же не сокрушаешься, что при вызове не видишь названий параметров у функции?
Но вот с теми же метаданными проблемы точно возникнут.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
На последней сборке NemerleSetup-1.0.0.8784.msi создание MVC проекта вылетает с ошибкой
---------------------------
Microsoft Visual Studio
---------------------------
Error: this template attempted to load an untrusted component 'Microsoft.VisualStudio.Web.Mvc.2.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. For more information on this problem and how to enable this template, please see documentation on Customizing Project Templates.
---------------------------
ОК
---------------------------
Здравствуйте, alvas, Вы писали:
A>На последней сборке NemerleSetup-1.0.0.8784.msi создание MVC проекта вылетает с ошибкой
A>--------------------------- A>Microsoft Visual Studio A>--------------------------- A>Error: this template attempted to load an untrusted component 'Microsoft.VisualStudio.Web.Mvc.2.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. For more information on this problem and how to enable this template, please see documentation on Customizing Project Templates. A>--------------------------- A>ОК A>---------------------------
A>на Win7 64bit.
Здравствуйте, hardcase, Вы писали:
H>А это не криво ли поставлен сам ASP.NET MVC 2.0?
Хрен его знает. Я его вообще не ставил. Он установился вместе с VS2010.
Путь из проекта на c# показывает такой
C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll