使用HttpPost方法提交表单后,ASP.NET Core重定向到同一页面

时间:2017-11-08 07:16:19

标签: c# asp.net .net asp.net-mvc razor

我正在使用ASP.NET Core 2.0开发Web应用程序。 首先,我有一个名为NewOrder.cshtml的主视图:

@using Microsoft.AspNetCore.Mvc.Rendering
@using MokaKukaMap.Orders.ViewModels.Models
@model MokaKukaMap.Orders.ViewModels.Models.NewOrderViewModel

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@Html.Partial("_NewOrder")

在这个主视图中,我在局部视图中使用了一个表单(_NewOrder.cshtml):

<form asp-controller="NewOrder" asp-action="CreateOrder" class="well">
    <div id="form-horizontal">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <input type="hidden" id="eventID" class="form-control">
        <div class="form-group">
            <label asp-for="Address" class=""></label>
            <div class="">
                <input asp-for="Address" class="form-control">
                <span asp-validation-for="Address" class="text-danger"> </span>
            </div>
        </div>
        <div class="form-group">
            <label asp-for="PhoneNumber" class=""></label>
            <div class="">
                <input asp-for="PhoneNumber" class="form-control">
                <span asp-validation-for="PhoneNumber" class="text-danger"> </span>
            </div>
        </div>
    </div>
    <div id="ErrorsBox" class="alert alert-danger" style="display: none;"></div>
    <div class="form-group">
        <div class="">
            <input type="submit" formnovalidate="formnovalidate" value="Submit new order" class="btn btn-primary" />
        </div>
    </div>
</form> 

当然我有相应的控制器和HttpPost动作方法,如下所示:

public class NewOrderController : Controller
{
    private readonly INewOrderSaverRequestHandler _newOrderSaverRequestHandler;

    public NewOrderController(INewOrderSaverRequestHandler newOrderSaverRequestHandler)
    {
        _newOrderSaverRequestHandler = newOrderSaverRequestHandler;
    }

    public IActionResult NewOrder()
    {
        return View();
    }

    [HttpPost]
    public IActionResult CreateNewOrder(NewOrderViewModel newOrder)
    {
        _newOrderSaverRequestHandler.Handle(newOrder, ModelState);

        return RedirectToPage("NewOrder");
    }
}

问题是,如果我点击提交按钮,页面会被重定向到以下网址:&#34; http://localhost:13078/NewOrder/CreateOrder&#34;。但我想要的是保持同一页面,所以在&#34; http://localhost:13078/NewOrder/NewOrder&#34; URL

我已经尝试了一些我在stackoverflow找到的解决方案:

  • 使用return RedirectPage("NewOrder") - 我仍然被重定向到... / NewOrder / CreateOrder,因此到404错误页面。此外,我尝试将其与return RedirectPage("/")return RedirectPage("NewOrder/NewOrder")等其他组合使用,但没有一个能够找到正确的解决方案
  • 使用return View("NewOrder")我仍然被定向到&#34; ... / NewOrder / CreateOrde&#34;以及
  • 我还尝试了以下内容:return Page()但是这个依赖/引用在asp.net core 2.0中是未知的。
  • 此外,我尝试通过设置&#34; asp-route-returnurl&#34;来解决我的问题。我的html表单标记中的属性,但没有成功。

好吧,我想我的问题可能与我的路由有关。我在Startup.cs中使用以下路由设置:

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Map}/{action=Index}/{id?}");
    });

最后但并非最不重要的是我尝试使用注释路由,但它也无法解决我的问题:

    [Route("[controller]/NewOrder")]
    [HttpPost]
    public IActionResult CreateNewOrder(NewOrderViewModel newOrder)
    {
        _newOrderSaverRequestHandler.Handle(newOrder, ModelState);

        return RedirectToPage("NewOrder");
    }

所以我想要的是点击提交按钮后,创建一个新订单(由INewOrderSaverRequestHandler处理)然后保持在同一页面上。您如何看待问题出在我的代码中?提前谢谢!

1 个答案:

答案 0 :(得分:1)

请替换此

 <form asp-controller="NewOrder" asp-action="CreateOrder" class="well">

   <form asp-controller="NewOrder" asp-action="NewOrder" class="well">

你正在使用asp-action =“CreateOrder”这就是为什么它会转向CreateOrder方法