ASP .NET MVC控制器模型参数为null

时间:2015-04-24 08:04:59

标签: c# asp.net-mvc

我想要实现的最终目标是从HTTP POST请求获取MULTIPLE PARAMS,所以如果您知道其他任何方法,请通知我。

我正在使用

  • ASP .NET自托管MVC,最新版本。
  • 本地主机
  • 属性mapping_ for routing
  • 用于POST消息测试的一些chrome扩展,我没有忘记将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

我有点想通了对于POST消息,我必须使用Model来使用单个参数(这是真的吗?),所以我添加了一个名为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的{​​{1}}值。请帮我弄清楚如何在HTTP POST中获取多个参数。

【解析(也许?)]

RAW数据如下所示:

report

我正在发送' 表单数据' Postman Chrome扩展程序中的标签,无法一次又一次地工作。 然后我改为' raw'选项卡,然后它就可以正常工作。

我仍然不知道问题是什么。但是,非常感谢你的帮助。

4 个答案:

答案 0 :(得分:0)

您需要配置Web 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

答案 1 :(得分:0)

使用API​​时,最好将模型用于多个参数。

如果您使用的是Javascript,则使用模型中的相同名称构建对象,它们将在请求中进行映射。

此外,如果你需要相同的数据来操作前端,你可以建立一个对象并像这样返回

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

答案 2 :(得分:0)

你可以从jquery调用post方法并传递数据字段中的参数。

$.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);
    }
});

答案 3 :(得分:0)

确保发布到Web API操作的数据结构与模型的数据结构匹配。

为了帮助您进行调试,您可以安装名为Swashbuckle的Nuget包。 Swashbuckle记录了您当前基于MVC / Web API的控制器和操作,并考虑了每个控制器和输出的输入和输出。最好的部分(以及最能帮助你的部分)是它提供了一个用于测试每个动作的UI,甚至可以根据动作参数的结构创建所需的数据结构。

安装软件包会创建一个路由(例如http://myrooturl/swagger)供您访问UI本身,因此无需配置,因为它开箱即用。

如果您可以使用它来执行API操作并填充参数,那么您手动创建POST的方法就有问题。如果由于某种原因它仍然失败,那么至少你有一个自我文档的方法,因为Swagger UI会自动更新动作列表。