2012-03-21 3 views
2

Я использую Action для получения данных отчета, как объекта JSON, без проблем. Отправьте ему форму с помощью jQuery ajax.Действие работает с POST, но не с GET (строка запроса)

Но теперь мне нужно возвращать разные типы результатов в зависимости от значения параметра. Он должен возвращать либо JSON, файл Excel (построенный с помощью HTML), либо файл PDF. Поэтому я создал вложенное перечисление для моего класса контроллера для ограничения доступных типов возвращаемых данных.

Но теперь, когда я пытаюсь вызвать действие от URL для создания файлов, он бросает ArgumentException с сообщением:

The parameters dictionary contains a null entry for parameter 'dataInicio' of non-nullable type 'System.DateTime' for method 'System.Web.Mvc.ActionResult DadosRelatorioResumoLancamentos(System.Nullable`1[System.Int32], System.String, System.DateTime, System.DateTime, TipoResultado)' in 'Imovelweb.Web.Intranet.Controllers.RelatoriosController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

Тем не менее, параметр dataInicio присутствует в строке запроса :

http://localhost:32331/Relatorios/DadosRelatorioResumoLancamentos?codFantasia=106&numAp=&dataInicio=21%2F03%2F2012&dataFim=21%2F03%2F2012&tipoResultado=1

Я попробовал оригинальный запрос (которым возвращает содержимое JSON) с обоими методами, и она работает с POST, но п ot с GET (забрасывается то же самое ArgumentException).

Что мне не хватает?


Вот подпись метода действия в:

public ActionResult DadosRelatorioResumoLancamentos(
    int? codFantasia, 
    string numAp, 
    DateTime dataInicio, 
    DateTime dataFim, 
    TipoResultado tipoResultado = TipoResultado.Json 
); 

А вот перечисление:

public enum TipoResultado 
{ 
    Json, 
    Excel, 
    Pdf 
} 
+0

Как таблица Маршрут выглядит? Мне кажется, что MVC вызывает неправильный метод действий - тот, у кого нет параметра dataInicio? –

+0

@TomasVoracek Вызывалось правильное действие. Проблема заключалась в формате даты, как сказано в ответе pjumble. – Raphael

ответ

7

У меня была эта проблема, по умолчанию ASP.NET MVC модель связующими разбирает Значение QueryString равно InvariantCulture, тогда как значения POSTed формы будут проанализированы с использованием CurrentCulture.

Это означает, что в вашем запросе GET он попытается проанализировать 21/03/2012 в американском формате MM/dd/yyyy, что является недопустимым. Поскольку ваш параметр dataInicio не имеет значения NULL, он не сможет предоставить подходящее значение, чтобы он выбрал ArgumentException.

Там есть полный рецензия/обходной путь здесь: http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx