在返回视图之前,有没有办法在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);
}
此外,对于整体功能的任何建议都表示赞赏。
答案 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