2015-04-24 6 views
0

Конечной целью, которую я хочу достичь, является получение МНОЖЕСТВЕННЫХ ПАРАМЕТРОВ из HTTP POST-запроса, поэтому, если вы знаете какие-либо другие способы ее выполнения, пожалуйста, сообщите мне.Параметр модели контроллера ASP.NET MVC имеет значение null

Я использую

  • ASP .NET автономный хостинг MVC, последнюю версию.
  • локальный
  • атрибут mapping_ для маршрутизации
  • некоторые хром расширение для испытаний сообщений POST, и я не забыл добавить Content-Type: application/json в заголовок!

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

[RoutePrefix("report")] 
public class DefaultController : ApiController 
{ 
    [HttpPost, Route("error")] 
    public HttpResponseMessage Echo(string uid, string buildNumber, string log, 
     string stack, string context, ...) 
    { 
     Console.WriteLine("received message: "); 
     Console.WriteLine(" uid: " + uid); 
     Console.WriteLine(" buildNumber: " + buildNumber); 
     Console.WriteLine(" log: " + log); 
     Console.WriteLine(" stack: " + stack); 
     ... 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

Но если я пытаюсь получить доступ к http://localhost:XXX/report/error, который будет перенаправлен к контроллеру, я получил следующее сообщение:

No HTTP resource was found that matches the request URI

I несколько понял, что для сообщения POST я должен использовать один параметр (это реальный?) с использованием модели, поэтому я добавил модель ReportModel и переработал ее следующим образом:

[RoutePrefix("report")] 
public class DefaultController : ApiController 
{ 
    [HttpPost, Route("error")] 
    public HttpResponseMessage Echo(ReportModel report) 
    { 
     Console.WriteLine("received message: "); 
     Console.WriteLine(" uid: " + report.Uid); 
     Console.WriteLine(" buildNumber: " + report.BuildNumber); 
     Console.WriteLine(" log: " + report.Log); 
     Console.WriteLine(" stack: " + report.Stack); 
     ... 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

Теперь я получаю null значение для параметра report. Пожалуйста, помогите мне разобраться, как получить несколько параметров в HTTP POST.

[(? Возможно) ПОСТАНОВИЛИ]

RAW данные, кажется, как показано ниже:

POST /report/error HTTP/1.1 
Host: localhost:10999 
Content-Type: application/json 
Accept: application/json 
Cache-Control: no-cache 

{ "Uid":"asdf", "BuildNumber":"qwer", "Log":"hoo", "Stack":"asdfasdf", ... 

И я отправлял на вкладке 'форм-данных' в расширении Почтальон Chrome, который не работает снова и снова. Затем я перешел на «сырую» вкладку, тогда она просто отлично работает.

Я все еще не знаю, в чем была проблема. Но все же, большое спасибо за вашу помощь.

+0

Другая альтернатива - [FormCollection] (https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k%28System.Web.Mvc.FormCollection%29%3Bk%28TargetFrameworkMoniker- .NETFramework, версия% 3Dv4.5.2% 29% 3Bk% 28DevLang-csharp% 29 & rd = true), но это больше, если у вас нет фиксированной модели. – Raidri

+0

Как выглядит фактический POST? – Liam

+1

Первое, что нужно проверить, это ваше тело POST с Fiddler. Также класс ReportModel должен иметь общедоступные свойства для де-сериализации. – Padraic

ответ

0

Убедитесь, что ваша структура данных, отправляемая в действие веб-API, соответствует модели вашей модели.

Чтобы помочь в ваших усилиях по отладке, вы можете установить пакет Nuget под названием Swashbuckle. Swashbuckle документирует ваши текущие контроллеры и действия на основе MVC/Web API с учетом ввода и вывода каждого из них. Наилучшая часть (и бит, который должен вам больше всего помочь) заключается в том, что он предоставляет пользовательский интерфейс для тестирования каждого действия, даже если вы собираетесь создать структуру данных, требуемую на основе структуры вашего параметра действия.

Установка пакета создает маршрут (например, http://myrooturl/swagger) для доступа к самому пользовательскому интерфейсу, поэтому нет необходимости в настройке, поскольку он работает из коробки.

Если вы можете использовать действие API, используя его, и параметры заполнены, тогда ваш ручной метод создания POST виноват. Если по какой-то причине все еще не удается, по крайней мере у вас есть метод самостоятельной документации, так как пользовательский интерфейс Swagger будет автоматически обновлять список действий.

0

вам необходимо настроить маршрут веб-API для принятия параметра ReportModel.

config.Routes.MapHttpRoute(name: "newont", 
       routeTemplate: "api/{controller}/{ReportModel}/{id}", 
       defaults: new { controller = "Controllername", ReportModel= "ReportModel", new { id = RouteParameter.Optional }} 
      ); 

For more info

+0

Я использую атрибуты для маршрутизации (например, 'httpConfig.MapHttpAttributeRoutes();'). Должен ли я по-прежнему настраивать маршрутизацию явно? Я хочу иметь дело с кодами без функции «MapHttpRoute()». –

+0

@ParkJongBin не нужно добавлять и –

+0

И фактически работает маршрутизация. Я могу приложить отладчик на код контроллера, и там, где я нашел параметр 'report', равен нулю. –

0

При использовании API хорошей практики, чтобы использовать модель для нескольких параметров.

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

Кроме того, если вам необходимы одни и те же данные обратно манипулировать передний конец вы можете создать объект и вернуть его как так

return Request.CreateResponse(HttpStatusCode.OK, myObject);

+2

. Просто добавьте сюда: я вижу, что ваши свойства модели CamelCased и параметры, которые вы получаете, не являются; отображение чувствительно к регистру. –

+0

Модель имеет свойства CamalCased, и я также изменил свой HTTP-отправитель POST для отправки ключей CamalCased. –

0

вы можете вызвать метод поста от JQuery и передать параметры в поле данных.

$.ajax(
{ 
    url: "report/error", 
    type: "POST", 
    data: { uid: "1", buildNumber: "123", log ="log string", context = "context", stack = { property: "value"} }, 
    success: function (result) { 
     alert(result); 
    }, 
    error: function (xhr, status, p3, p4) { 
     var err = "Error " + " " + status + " " + p3; 
     if (xhr.responseText && xhr.responseText[0] == "{") 
      err = JSON.parse(xhr.responseText).message; 
     alert(err); 
    } 
}); 
Смежные вопросы