ASP.NET 5 WebAPI

时间:2016-03-11 22:01:21

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

我在ASP.NET 5 webapi中创建API post方法。我要求我需要创建重载的post方法,如下所示。

$new_commit

我尝试了多个选项来设置路由参数,如下所示。

[HttpPost]
public bool LogInfo([FromBody]LogEventModel value)
{
}


[HttpPost]
public bool LogInfo (String strInformation)
{
}

(或)

[HttpPost("LogInfo/{strInformation}")]

但它不起作用。我希望我在这里弄乱一些东西。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

我不认为这是可能的。由于控制器和Web API控制器现在是同一个事实,路由也已统一。您可以阅读更多相关信息here

所以我要做的是,这是我的控制器代码:

    public class HomeController : Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        ViewBag.Title = $@"{nameof(HomeController)}-{nameof(Index)}";
        return View();
    }

    [HttpPost]
    [Route("home/setsomething2", Name = "SetSomething2")]
    public void SetSomething([FromBody]SomeValueModel someValue)
    {
        var value = someValue;
    }


    [HttpPost]
    [Route("home/setsomething1", Name = "SetSomething1")]
    public void SetSomething(String someValue)
    {
        var value = someValue;
    }
}

public class SomeValueModel
{
    [JsonProperty("somevalue")]
    public string SomeValue { get; set; }
}

这就是我从视图Index.cshtml中调用它的方式:

    function postSomething1() {
    var url = "@Url.RouteUrl("SetSomething1", new {someValue = "someValue"})";
    $.post(url)
        .done(function () {
            alert("Succes!");
        })
        .fail(function (response) {
            console.log(response);
            alert("Fail!");
        });
}
function postSomething2() {
    var url = "@Url.RouteUrl("SetSomething2")";
    $.ajax({
        contentType: 'application/json',
        data: JSON.stringify({ "somevalue": "myvalue" }),
        dataType: 'json',
        success: function () {
            alert("Succes!");
        },
        error: function () {
            alert("Error!");
        },
        processData: false,
        type: 'POST',
        url: url
    });
}

但是,您可以使SetSomething2的路由更加RESTful,例如:

[Route("home/setsomething/{someValue}", Name = "SetSomething2")]

注意:请注意路径&#39; home / setsomething /&#39;从数字中删除,所以这将是我最喜欢的方式。

如果你真的不想做出不同的路线,你就不能使用命名路线。因此,您必须抛弃以下名称:

[Route("home/setsomething")]

[Route("home/setsomething/{someValue}")]

然后在jQuery中调用它们,例如:

var url = "home/setsomething/somevalue";

答案 1 :(得分:0)

这就是我的工作。

我更喜欢通过以下方式为每个控制器指定路由:

[Route("[controller]/[action]")]

然后一个动作可能如下:

[HttpPost]
[ActionName("GetSomeDataUsingSomeParameters")]
public List<Thing> GetSomeDataUsingSomeParameters([FromBody] MyParameters parms)
{
    return Repo.GetData(parms);
}

请求可能如下所示:

http://myhost/mycontroller/GetSomeDataUsingSomeParameters

通过POST方法将参数作为Json结构传递给正文。例如:

{"Parameter1":1,"Parameter2":"a string"}

请求还应指定:

Content-Type: application/json

所以,让我们说你的班级是:

public class Thing
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后响应可能是(在数据库中找到两件事):

[{"Id":1,"Name":"First thing"},{"Id":2,"Name":"Another thing"}]