【问题标题】:ASP.NET Core redirecting to the same page after submitting a form with HttpPost method使用 HttpPost 方法提交表单后,ASP.NET Core 重定向到同一页面
【发布时间】:2017-11-08 07:16:18
【问题描述】:

我正在使用 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");
    }
}

问题是,如果我单击提交按钮,页面将重定向到以下网址:“http://localhost:13078/NewOrder/CreateOrder”。但我想留在同一页面上,所以在“http://localhost:13078/NewOrder/NewOrder”网址

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

  • 使用return RedirectPage("NewOrder") - 我仍然被重定向到 .../NewOrder/CreateOrder 所以到 404 错误页面。此外,我尝试将它与 return RedirectPage("/")return RedirectPage("NewOrder/NewOrder") 等其他组合一起使用,但它们都没有导致正确的解决方案
  • return View("NewOrder") 我仍然被定向到“.../NewOrder/CreateOrde”
  • 我还尝试了以下方法:return Page() 但此依赖项/引用在 asp.net core 2.0 中是未知的。
  • 此外,我尝试通过在我的 html 表单标签中设置“asp-route-returnurl”属性来解决我的问题,但没有成功。

好吧,我认为我的问题可能与我的路由有关。我在 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 处理)然后留在同一页面上。您怎么看,问题出在我的代码中?提前致谢!

【问题讨论】:

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


    【解决方案1】:

    请更换这个

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

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

    您正在使用 asp-action="CreateOrder" 这就是为什么它要使用 CreateOrder 方法

    试试这个return RedirectToAction("ActionMethod", "Controller");

    【讨论】:

    • 试试这个 return RedirectToAction("ActionMethod", "Controller");
    【解决方案2】:

    如果应用在 dot net core 中,请检查 Pages 文件夹中的文件

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:
    [HttpPost]
    public IActionResult CreateNewOrder(NewOrderViewModel newOrder)
    {
        _newOrderSaverRequestHandler.Handle(newOrder, ModelState);
    
        return RedirectToAction("NewOrder", "NewOrder");;
    }
    

    使用RedirectToAction("ActionMethod", "Controller"); 代替RedirectToPage("yourPageName");

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2017-06-26
      相关资源
      最近更新 更多