У меня есть этот маршрут, который работал до того, как мы обновили наше приложение до MVC3:
routes.MapRoute(
"Versioned API with Controller, ID, subentity",
"api/{version}/{controller}/{id}/{subentity}/",
new { controller = "API", action = "Index" },
new { id = @"\d+", subentity = "serviceitem|accessitem" }
),
Я пытаюсь пройти по этому маршруту с помощью POST на следующий URL:
/api/1.0/items/3/serviceitem
Мой метод контроллера имеет эту подпись:
[ActionName("Index"), AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateServiceItem(int id)
Когда я пытаюсь использовать этот метод, я получаю следующую ошибку:
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult CreateServiceItem(Int32)' in 'API.Controllers.ItemsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters
Изменился ли какой-то синтаксис между mvc2 и mvc3?
РЕДАКТИРОВАТЬ: Обновленная информация!
Я думаю, что нашел виновника. Я публикую некоторые данные в формате JSON на URL. Мой JSON-объект выглядит так:
{ Id: null, OtherProperty: 'foo' }
MVC3 использует идентификатор из моего объекта JSON, а не идентификатор, указанный в URL. Это поведение настраивается?
РЕДАКТИРОВАТЬ 2: Воспроизводимый пример:
Мы используем Ext в нашем приложении, поэтому мой пример с Ext, но я могу воспроизвести его, это в моем /Views/Home/Index.aspx:
Ext.onReady(function() {
var w = new Ext.Window({
title: 'Hi there',
height: 400,
width: 400,
items: [
new Ext.Button({
text: 'Click me',
handler: function() {
var obj = {
Id: null,
Text: 'Hi there'
};
Ext.Ajax.request({
url: '/item/3/serviceitem',
method: 'POST',
jsonData: Ext.util.JSON.encode(obj),
headers: { 'Content-type': 'application/json' },
success: function(result, request) {
console.log(result);
},
failure: function(result, request) {
console.log(result);
}
});
}
})
]
});
w.show();
});
В моем Global.asax у меня есть следующий маршрут:
routes.MapRoute(
"Test",
"{controller}/{id}/{subentity}",
new { action = "Index" },
new { id = @"\d+", subentity = "serviceitem" }
);
В моем / Controllers / ItemController у меня есть этот метод:
[ActionName("Index")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateServiceItem(int id)
{
string data;
using (StreamReader sr = new StreamReader(Request.InputStream))
{
data = sr.ReadToEnd();
}
return Json(new
{
DT = DateTime.Now,
Id = id,
PostedData = data
});
}
Когда я нажимаю кнопку, вызывая POST для контроллера с указанными данными JSON, я получаю ту же ошибку, что и выше. Если я не отправляю данные JSON, это работает (поскольку MVC будет использовать часть URL в качестве параметра моего метода).
Вот ссылка на мое решение для репродукции: http://www.mediafire.com/?77881176saodnxp