Что такое эквивалент WebApi [FromUri] в ASP.NET MVC?

в WebApi я могу украсить параметр действия контроллера с помощью [FromUri] чтобы компоненты URI "десериализовались", если хотите, в модель POCO; aka model-binding.

несмотря на использование MVC с 2.0, Я никогда не использовал его для веб-сайтов (не знаю почему). В чем его эквивалент? ASP.NET MVC 5?

атрибут, похоже, не распознается в IDE, если мне не нужно ссылаться на библиотеку.

Я хочу ~/thing/2014/9 для привязки к модели ниже:

public class WhateverModel
{
    public int Year { get; set; }
    public int Month { get; set; }
}

спасибо

обновление

в другом вопросе (ссылка выше) ОП говорит:

однако переключите это на простой MVC не WebApi, и связыватель модели по умолчанию сломается и не сможет связать свойства объектов во вложенном массиве

что означает, что он использует атрибут из WebApi. Я думаю. У меня нет этих ссылок, потому что я в MVC, поэтому (ab)использует версию WebApi принятый способ сделать это в MVC?

обновление 2

в ответе на этот вопрос:

вам нужно построить строку запроса, соблюдая соглашения об именах связывателя модели MVC.

дополнительно [FromUri] атрибут в вашем примере действия полностью игнорируется, так как он не известен MVC DefaultModelBinder

так что я все еще не знаю, что делать или что на Земле ОП даже говорил об этом вопрос, если он добивался успеха с неправильным атрибутом.

думаю, я надеюсь на ясный ответ, а не на грязь этого другого вопроса.

1 ответов


это будет просто работать™:

[HttpGet]
public ActionResult Thing(WhateverModel model)
{
    // use model
    return View();
}

по крайней мере, при использовании URL /thing?Year=2014&Month=9.

проблема в маршрутизации. URL-адрес /thing/2014/9 не будет отображать маршрут по умолчанию MVC, так как это /{controller}/{action}/{id}, где {id} является необязательным int.

проще всего было бы использовать маршрутизацию атрибутов:

[HttpGet]
[Route("/thing/{Year}/{Month}"]
public ActionResult Thing(WhateverModel model)
{
    // use model
    return View();
}

это сопоставит URL-адрес вашей модели.