2010-03-04 3 views
17

Я довольно долго использовал T4MVC (FYI: v2.6.62), и я медленно двигался по нашему коду таким образом работы (меньше полагался на magic strings).Сильно типизированный T4MVC Action/ActionLink

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

Ниже приведен пример: пробой

Маршрут:

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

ответ

17

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

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

Копирование мой ответ от forum thread:

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

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

Есть ли у вас другие проблемы и думаю, что стоит обратиться?

+1

Hi David. Спасибо за ответ. Я предполагаю, что, учитывая 5 upvotes в короткий период, это было означало, что это, вероятно, желаемая функциональность. :-) –

+0

Хорошо, я положу его в список TODO! :) –

+0

Спасибо! Я бы счел это особенно полезным, так как я создал несколько ActionResults, таких как PermanentRedirectResult, которые используют действия стиля T4MVC, и такая функциональность будет отличной, а не только для использования в представлениях! –

4

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

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

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

Edit: (Ответ на комментарий не хватает символов)

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

+0

Боюсь, что это не сработает. Он возвращает значения маршрута, но они неправильно сформированы. Кроме того, если он установлен с использованием этого метода обертывания типа non value, вам нужно будет сделать это рекурсивно, потому что там вы можете использовать сложный тип, который содержит другие сложные типы ... –

+0

, отредактированный в ответ на вышеуказанный комментарий – PabloBlamirez

Смежные вопросы