Ajax.BeginForm忽略MVC 5中参数中定义的动作和控制器

时间:2015-07-21 06:42:43

标签: ajax asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing ajax.beginform

我正在使用属性路由来获取页面的操作。但是当我发布它时,ajax表单忽略了我在参数中定义的动作和控制器,并尝试使用get方法发布到相同的URL。

这是我的行动:

[AllowAnonymous]
[HttpGet]
[Route("path")]
public ActionResult Action()
{
    return View();
}

这是我的帖子:

[AllowAnonymous]
[HttpPost]
public JsonResult Action(Model model)
{
    return Json(true);
}

这是我的观点:

@using (Ajax.BeginForm("Action", "Controller", new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = "someDiv" }))
{

    @SomeInput

    <input type="submit" value="send" />

}

生成的HTML:

<form action="/path" data-ajax="true" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="#someDiv" id="form0" method="post">        
    <input value="submit" type="submit">
</form>

单击按钮时。发布到域/路径的帖子。为什么我定义的动作被忽略了?

2 个答案:

答案 0 :(得分:0)

  routes.MapRoute(
              name: "Any Name",
              url: "Any URL",
              defaults: new { Controller = "Your Ajax Controller Name ", action = "Your Ajax action Name" }
              );

或试试这个

  routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

将此添加到RouteConfig.cs

中的所有路由的最后一个

答案 1 :(得分:0)

我能够通过在Controller / Action之后添加空RouteValue来解决此问题:

@using (Ajax.BeginForm("Action", "Controller", null, new AjaxOptions() { HttpMethod = "POST", UpdateTargetId = "someDiv" }))
{
    @SomeInput
    <input type="submit" value="send"/>
}

在我的示例中,我有一个EditorTemplate及其自己的Ajax.BeginForm定义。当我从DisplayTemplate内渲染那个EditorTemplate时,它会将子EditorTemplate的Controller目标覆盖为父DisplayTemplate所使用的Controller目标,但是它保持相同的Action。因此,至少在我的情况下,如果没有提供,则看起来RouteValues被覆盖了。