ASP.Net WebApi:在BeginForm中生成的URL无效

时间:2013-10-13 17:53:11

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

我开始使用WebApi,我遇到了网址生成错误的问题

我有一个像这样的ApiController:

public class EntriesController : ApiController
{
    public HttpResponseMessage Post(Entry entry)
    {
    ...
    }
}

我试图在同一个项目中创建一个标准控制器(即不是webapi)来测试这个api(我已经用fiddler测试了api,一切都很好)。

我假设我可以使用这样的标准HTML帮助器:

@using (Html.BeginForm("Post", "Entries"))

然而,这会产生以下标记:

<form action="/Entries/Post" method="post">

我希望它能够生成

<form action="/api/Entries" method="post">

从视图生成API网址的正确方法是什么?

我正在使用默认的api和控制器路由。

由于

3 个答案:

答案 0 :(得分:0)

@using (Html.BeginForm("Post", "Entries"))

您不能像上面那样将WebAPI控制器和方法放在MVC BeginForm中。您需要将MVC控制器和操作传递给BeginForm。

您可以在MVC控制器中创建WebAPI EntriesController实例,然后使用此实例调用WebAPI方法。见下文:

//MVC Controller
public class EntriesController : Controller
{
    [HttpGet]
    public ActionResult Entries()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Entries(SomeModels model)
    {
        if (ModelState.IsValid)
        {
            var api = new EntriesController(); // Create WebAPI instance Here
            api.Post(model.entry);

            return RedirectToAction("Index", "Home");
        }
        return View();
    }
}

答案 1 :(得分:0)

这在技术上可行:

@using (Html.BeginForm("Post", "api/Entries"))

不要忘记,.BeginForm()扩展方法中的“发布”值对开箱即用的Web Api路由设置没有任何意义。只有url和HTTP操作很重要(以及方法重载的URL上的任何其他值)

答案 2 :(得分:0)

您需要使用BeginRouteForm,因为Web API路由的链接生成始终取决于路由名称。另外,请确保提供名为httproute的路由值,如下所示。

@using (Html.BeginRouteForm("DefaultApi", new { controller="Entries", httproute="true" }))