Я использовал T4MVC (к вашему сведению: v2.6.62) в течение достаточно долгого времени, и я медленно отодвигался наш код к этому способу работать (меньше уверенности в волшебных строках).
Но я должен был остановиться, потому что по некоторым причинам T4MVC не может перевести объекты в URL и только, кажется, может работать над типами примитивов (интервал/строка/и т.д.).
Вот пример:
Разбивка маршрута:
/MyController/MyAction/{Number}/{SomeText}
Класс:
namespace MyNamespace
{
public class MyClass
{
public int Number { get; set; }
public string SomeText { get; set; }
}
}
Контроллер:
public class MyController
{
public virtual ActionResult MyAction(MyClass myClass)
{
return View();
}
}
Посмотреть:
<%= Html.Action(
T4MVC.MyController.Actions.MyAction(
new MyClass()
{
Number = 1,
SomeText = "ABC"
}
) %>
Конечный результат - это:
/MyController/MyAction?myClass=MyNamespace.MyClass
и нет
/MyController/MyAction/1/ABC
У кого-либо еще есть эта проблема? Доступны URL T4MVC как это?
Вопрос также задают на Форуме ASP.NET.
Обновление (10/11/2012) : недавно добавленная поддержка Model Unbinders (см. Раздел 3.1 в doc ), мы надеемся, охватит многие из этих случаев.
Исходный ответ:
Копирование моего ответа из ветки форума :
Хммм, я не думаю, что это еще произошло. Может быть, в большинстве случаев, когда у людей есть методы Action, которые принимают объект, значения объекта берутся из опубликованных данных формы, а не передаются по URL-адресу? В таком сценарии вопросов не возникает.
Я думаю, что теоретически T4MVC можно изменить для поддержки этого. Ему просто нужно было бы продвигать все свойства верхнего уровня объекта как значения маршрута, а не пытаться использовать сам объект (очевидно, текущее поведение является фиктивным и является результатом простого вызова ToString () вслепую).
Другие сталкивались с этим и думали, что к этому стоит обратиться?
Если я правильно понял проблему, следующий синтаксис должен позволить вам обойти проблему.
<%= Html.ActionLink("test", MVC.MyController.MyAction().AddRouteValues(new MyClass() { Number = 5, SomeText = "Hello" })) %>
Я думаю, чтобы сделать синтаксис лучше, можно было бы обернуть каждый параметр, не являющийся типом значения, в RouteValueDictionary в каждом сгенерированном методе результата действия
Изменить: (Ответ на комментарий как недостаточное количество символов)
Ах, хорошо, удалось воссоздать простой пример выше, используя этот метод, чтобы указать: / MyController / MyAction / 5 / Hello
в качестве URL-адреса.
Я не совсем уверен, как вложенные сложные типы будут реализованы на практике. Вы можете использовать некоторую рекурсию, чтобы погрузиться в объект верхнего уровня и поразмышлять над значениями, чтобы добавить их, но тогда вы откроете новый набор проблем, например, как справиться с именем дочернего свойства, которое идентично родительскому. имя свойства.
Похоже, что решить эту проблему может быть непросто, и это подойдет всем.
Возможно, какой-то шаблон адаптера был бы наиболее полезным для преобразования сложного объекта в значения маршрута. В простейшем случае это может быть объявление метода расширения ToRouteDictionary, который воздействует на ваш сложный тип и преобразует его, используя ваши знания о том, как он должен работать. Просто подумайте вслух, поскольку я, очевидно, не знаю ваших вариантов использования