Маршрутизация по типу размещенного контента в ASP.NET MVC - PullRequest
2 голосов
/ 21 апреля 2011

У меня есть fixedURL, в который я хотел бы публиковать различные типы XML-сообщений, десериализованных с использованием DataContracts.В зависимости от типа десериализованного сообщения я бы хотел перенаправить на: перегруженные методы, например

void Process(ContractType1 request) {}
void Process(ContractType2 request) {}

Так что в какой-то момент мне нужно десериализовать это сообщение и, надеюсь, разрешить правила маршрутизации по умолчанию соответствоватьправильный методКакую точку растяжения я должен использовать для этого?Или даже лучше, я могу сделать это из коробки?!

Если это имеет какое-то значение, я использую MVC 3.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2011

ASP NET MVC не учитывает перегрузку, если они не оформлены для разных методов HTTP - например, один для POST, другой для GET.

Вам необходимо использовать [ActionName(Name = "Process2")], чтобы изменить название маршрута. И вам придется использовать разные маршруты для доступа (если методы HTTP одинаковы)

Посмотрите здесь .


Помимо технического обходного пути, передача different contracts по тому же URL противоречит принципам REST . Данные могут быть в другом формате (XML, JSON, ...), но они должны быть одинаковыми. URI определяет уникальное намерение. Теперь возможно иметь общую корзину, где все документы выгружаются в один и тот же URI, но тогда механизм связывания модели ASP NET MVC по умолчанию не сможет вам помочь, и вам нужно создайте свою собственную модель переплета .

1 голос
/ 23 апреля 2011

Вопреки другому ответу, я говорю, что это возможно

Asp.net MVC - отличная платформа, которую можно легко расширить.И поэтому в основном я написал специальный селектор метода действия , который позволяет записывать перегрузки, которые могут обслуживать тот же метод HTTP, но с отложенными параметрами.По умолчанию вы получите ошибку во время выполнения, что метод действия не может быть решен.Но когда вы используете этот селектор методов действия, вы избавляетесь от этой ошибки.

В основном, если у ваших классов параметров есть разные имена параметров, вы можете фактически выбирать методы этим способом.

Селектор метода действия вызываетсяRequiresRouteValuesAttribute и типичный сценарий использования будет с маршрутом по умолчанию, где id является необязательным в:

{controller}/{action}/{id}

Это означает, что вы должны либо написать

public ActionResult Index(int? id)
{
    if (id.HasValue)
    {
        // display details view
    }
    else
    {
        // display master view
    }
}

, но используямой селектор методов действия вы можете легко написать два метода действия:

public ActionResult Index()
{
    // display master view
}

[RequiresRouteValues("id")]
public ActionResult Index(int id)
{
    // display details view
}

То же самое можно применить к вашим методам действия, если ваши пользовательские типы имеют разные имена свойств или методы используют разные имена параметров.Так что в вашем случае это может быть что-то вроде:

[RequiresRouteValues("first.Id")] // when you provide prefix with your form
// or
[RequiresRouteValues("Some.ContractType1.Distict.Property.Name")]
public ActionResult Process(ContractType1 first)
{
    // do what's appropriate
}

[RequiresRouteValues("second.Id")] // when you provide prefix with your form
// or
[RequiresRouteValues("Some.ContractType2.Distict.Property.Name")]
public ActionResult Process(ContractType2 second)
{
    // do what's appropriate
}

Прочитайте все детали об этом селекторе метода действия и получите код.

...