T4MVC Action/ActionLink со строгим контролем типов

Я использовал 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.

17
задан Dan Atkinson 23 June 2016 в 10:50
поделиться

2 ответа

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

Исходный ответ:

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

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

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

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

17
ответ дан 30 November 2019 в 13:40
поделиться

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

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

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

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

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

4
ответ дан 30 November 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: