C# 如何在返回视图之前修改控制器中的查询字符串

C# 如何在返回视图之前修改控制器中的查询字符串,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,在返回视图之前,是否有方法修改ASP.NET MVC 4控制器中请求的查询字符串/URL参数?我想在URL中附加一个参数 我尝试向请求.QueryString字典添加一个键,但它似乎是只读的 其他上下文信息: 我有一个ASP.NETMVC4页面,用户可以在其中在日历视图中创建事件。当用户单击“创建事件”按钮时,系统将为事件创建挂起的保留。然后将用户重定向到“编辑事件”视图。当用户填写“编辑事件”页面并提交时,将在挂起的保留上创建实际的日历事件 我的问题是,我不希望每次加载“编辑事件”页面时都创

在返回视图之前,是否有方法修改ASP.NET MVC 4控制器中请求的查询字符串/URL参数?我想在URL中附加一个参数

我尝试向
请求.QueryString
字典添加一个键,但它似乎是只读的


其他上下文信息:

我有一个ASP.NETMVC4页面,用户可以在其中在日历视图中创建事件。当用户单击“创建事件”按钮时,系统将为事件创建挂起的保留。然后将用户重定向到“编辑事件”视图。当用户填写“编辑事件”页面并提交时,将在挂起的保留上创建实际的日历事件

我的问题是,我不希望每次加载“编辑事件”页面时都创建一个新的挂起预订(例如,使用F5刷新)。因此,我想到了将新创建的挂起保留Id添加到查询字符串中的想法。这样,每次连续页面加载都将使用现有的挂起保留

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

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);
}

另外,如果您对整个功能有任何建议,我们将不胜感激。

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

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

使用以下方法:

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

/controller/EditEvent?value1=queryStringValue1
您应该使用模式来避免重复/多次提交表单

差不多

[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);
}

非常感谢。我意识到问题的根源是我在GET请求中创建了一个资源。你的回答帮助我解决了这个问题,把帖子和请求分开。