【问题标题】:How to bind more then one parameter for action in asp.net webapi?如何在asp.net webapi中绑定多个参数以进行操作?
【发布时间】:2015-10-15 10:06:08
【问题描述】:

我是 asp.net web api 的新手,在 asp.net web api 中,我如何让它自动绑定多个操作参数,如下所示。

public class DemoController : ApiController
{
    public class DemoModel
    {
        public string X { get; set; }

        public string Y { get; set; }

        public int Z {get; set;}
    }

    [HttpPost]
    public DemoModel GetParameter(string x,string y,int z)
    {
        return new DemoModel(){X = x, Y=y, Z=z};
    }
}

在一个 html 页面中,我使用 jquery ajax 将数据发布到 api,我得到了 404 错误。
我只是更改了默认路线。
默认值:

api/{controller}/{id}  

更改:

api/{controller}/{action}/{id}

【问题讨论】:

  • 不知道你有什么问题。只要您将它们作为请求参数,这三个将成功绑定到某些值
  • 我使用HttpPost属性标记action,我用post请求api,但是参数绑定不成功。
  • 问题一定出在你发帖的方式上,因为动作没有问题。你能告诉我们发布代码吗?
  • $.ajax("/api/demo/GetParameter", {data:{"x":"xxx","y":"yyy","z":234},成功:函数(数据){}}

标签: asp.net asp.net-web-api


【解决方案1】:

如果您希望能够传递动态参数而无需在 Action 方法上显式指定它们,则使 Action 无参数,然后在客户端将参数作为查询字符串值调用。
然后您可以使用以下方式检索 QS 值:

 var queryVals = Request.RequestUri.ParseQueryString();    
 var x = queryVals["x"];
 var y = queryVals["y"];
 var z = queryVals["z"];

【讨论】:

【解决方案2】:

首先,您应该将参数包装到某种 DTO(数据转换对象)模型中,然后转换为 DemoModel 而不是调用

return new DemoModel() {X = x, Y = y, Z = z}

您可以将操作的签名更改为以下内容:

[HttpPost]
public IHttpActionResult GetParameter(DemoModelDto model)
{
    if (ModelState.Valid)
    {
        var demoModel = DemoModel.FromDto(model);
        var url = Url.Route("{DefaultApi}", new {controller = "MyController", action = "MyAction", id = yourIdIfYouAreGeneratingIt});

        return Created(url, model);
    }

    return BadRequest(ModelState);
}

这里将发生的事情是ModelBinder 将接受请求并提取这些 x、y 和 z,并为您创建一个 DemoModelDTO,您可以使用它来创建您的 DemoModel。返回结果取决于ModelState 是否有效。如果是,则会返回 Created,即OK 的 HTTP 状态代码 200(或 Created 的 201),或者如果您的 ModelState 无效,它将返回 BadRequest,即 400。

除此之外,如果您想发送 X、Y 和 Z 作为 URL 参数,您需要发出如下请求:

POST http://localhost/Demo?x=1&y=2&z=3

使用您当前的实现或上述实现都会导致将值传递给 Web API。

【讨论】:

  • 还有什么办法吗?因为我不想为post的每一个动作都创建DTO模型。
  • 您可以忽略DTO并使用参数。 ModelBinder 将在发现它们时按它们的名称绑定它们。
  • 但我不想用get方法传递参数
  • 您不必这样做。使用 HttpPost 装饰您的操作,您将在发布后将其取回。
  • public IHttpActionResult GetParameter( string x,string y,string z) 我怎样才能让它与 ajax post 方法一起工作,我已经为动作装饰了HttpPost 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2017-05-22
相关资源
最近更新 更多