2013-10-13 61 views
0
產生無效的URL

我開始使用的WebAPI和我在與被錯誤地產生ASP.Net的WebAPI:在BeginForm

一個網址我有一個這樣的ApiController一個問題:

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

我試圖在同一個項目中創建一個標準的控制器(即不是webapi)來測試這個api(我已經用小提琴測試了api並且一切都很好)。

我以爲我可以使用標準的HTML輔助這樣的:

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

但是這會產生以下標記:

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

,我估計它產生

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

什麼是從視圖中生成API網址的正確方法?

我使用默認的api和控制器路由。

感謝

+1

的Web API不應該被用於張貼HTML表單,慣例是通過JSON對象Ajax調用。我的建議是重構您的代碼並將該帖子發送給正常的控制器。 – hjgraca

回答

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

你不能把的WebAPI控制器和控制方法在MVC BeginForm像上面。您需要將MVC Controller和操作傳遞給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(); 
    } 
} 
0

這在技術上是可以通過做:

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

不要忘了,在.BeginForm()擴展方法「後」值並不意味着任何東西,失盒Web Api路由設置。只有URL和HTTP動作很重要(以及URL上的任何附加值用於方法重載)

0

您需要使用BeginRouteForm作爲鏈接生成到Web API路由始終取決於路由名稱。還請確保提供如下路線值httproute

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