Строго типизированный T4MVC Action / ActionLink - PullRequest
17 голосов
/ 04 марта 2010

Я уже довольно давно использую T4MVC (FYI: v2.6.62), и я постепенно перебираю наш код на этот способ работы (меньше полагаясь на магию )strings ).

Но мне пришлось остановиться, потому что по какой-то причине T4MVC не может переводить объекты в URL-адреса и, похоже, может работать только с примитивными типами (int / string /и т.д.).

Вот пример:

Разбивка маршрута:

/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 .

Ответы [ 2 ]

17 голосов
/ 04 марта 2010

Обновление (10/11/2012) : недавно добавленная поддержка для Unbinders Model (см. Раздел 3.1 в doc ) должна, надеюсь, охватить многие из этих случаев.

Оригинальный ответ:

Копирование моего ответа из ветки форума :

Хммм, я не думаю, что это произошлоеще.Может быть, в большинстве случаев, когда у людей есть методы Action, которые берут объект, значения объекта берутся из опубликованных данных формы, а не передаются по URL?В таком сценарии вопрос не возникает.

Я думаю, что в теории T4MVC можно изменить, чтобы поддержать это.Для этого просто нужно выдвинуть все свойства верхнего уровня объекта в качестве значений маршрута, а не пытаться использовать сам объект (очевидно, текущее поведение является фиктивным и является результатом простого вызова ToString () вслепую).

Другие сталкивались с этим и думают, что стоит обратиться?

4 голосов
/ 09 марта 2010

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

<%= Html.ActionLink("test", MVC.MyController.MyAction().AddRouteValues(new MyClass() { Number = 5, SomeText = "Hello" })) %>

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

Редактировать: (Ответ на комментарий как недостаточно символов)

Ладно, я сумел воссоздать простой пример выше, используя этот метод, чтобы получить: /MyController/MyAction/5/Hello в качестве URL. Я не совсем уверен, как вложенные сложные типы будут работать на практике. Вы можете использовать некоторую рекурсию, чтобы погрузиться в объект верхнего уровня и обдумать значения, чтобы добавить их, но затем вы откроете новый набор проблем, например, как справиться с именем дочернего свойства, которое идентично родительскому. Имя свойства. Кажется, что это может быть сложной проблемой, которая будет работать для всех. Возможно, какой-то шаблон адаптера был бы наиболее полезен для преобразования сложного объекта в значения маршрута. В простейшем случае это может быть объявление метода расширения ToRouteDictionary, который действует на ваш сложный тип и преобразует его, используя ваши знания о том, как он должен работать. Просто размышляю вслух, поскольку я, очевидно, не в курсе ваших вариантов использования

...