如何在返回View之前修改Controller中的查询字符串

时间:2017-08-07 10:10:30

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

在返回视图之前,有没有办法在ASP.NET MVC 4 Controller中修改请求的查询字符串/ URL参数?我想在URL中添加一个参数。

我尝试在Request.QueryString词典中添加一个键,但它似乎是只读的。

其他背景信息:

我有一个ASP.NET MVC 4页面,用户可以在日历视图中创建一个事件。当用户点击"创建活动"按钮,系统为事件创建待处理的预留。然后,用户被重定向到"编辑事件"视图。当用户填写"编辑事件时,将在待处理的预留上创建实际日历事件"页面和提交。

我的问题是,每次"编辑活动"我都不想创建新的待定预订。页面已加载(例如,使用F5刷新)。因此,我想出了将新创建的待处理预留ID添加到查询字符串的想法。这样,每个连续页面加载都将使用现有的待处理预留。

但是,似乎无法在Controller中编辑查询字符串。有没有其他方法可以做到这一点?

public ActionResult CreateEvent()
{
    var model = new CalendarEventEditModel();

    //This should be true for the first time, but false for any consecutive requests
    if (Request.QueryString["pendingReservationId"] == null)
            {
                model.PendingReservationId =_ calendarService.CreatePendingReservation();
                //The following line throws an exception because QueryString is read-only
                Request.QueryString["pendingReservationId"] = model.PendingReservationId.ToString();
            }

    return View("EditEvent", model);
}

此外,对于整体功能的任何建议都表示赞赏。

3 个答案:

答案 0 :(得分:1)

查询字符串是浏览器发送给您的内容。您无法在服务器上修改它;它已经被发送了。

而是重定向到相同的路由,包括新创建的查询字符串。

答案 1 :(得分:1)

您应该使用Post/Redirect/Get模式来避免重复/多个表单提交。

这样的东西
[HttpPost]
public ActionResult CreateEvent(CreateEventViewModelSomething model)
{
    // some event reservation/persistent logic
    var newlyReservedEventId = _calendarService.CreatePendingReservation();
    return return RedirectToAction("EditEvent", new { id = newlyReservedEventId });
}

public ActionResult EditEvent(int id)
{
    var model = new CalendarEventEditModel();
    model.PendingReservationId = id;
    return View(model);
}

答案 2 :(得分:0)

使用此:

return this.RedirectToAction
  ("EditEvent", model, new { value1 = "queryStringValue1" });

会回来:

/controller/EditEvent?value1=queryStringValue1