我是ASP.Net MVC的新手。在PHP中,即使帖子请求无效,我也总是使用PRG模式。会话闪烁非常简单(也是用户友好的)。
然而,在ASP.Net MVC中,当请求无效时,我看不到一种简单的方法来执行PRG。我可以想到一些方法,但我不认为它们是好的做法,并且做了一些额外的不必要的工作。
此外,从我读过的几篇文章来看,当请求无效时,不建议使用PRG。如果这是一个不好的做法,那么处理不成功的帖子请求的更好方法是什么?没有PRG真的会更好吗?当用户尝试刷新页面时,我应该让讨厌的浏览器警告吗?
答案 0 :(得分:0)
在Mvc中,按照以下方式处理您的帖子操作是正常的做法:
[HttpPost]
[ValidateAntiForgeryToken]
public virtual ActionResult LoginForm(LoginViewModel loginViewModel)
{
if (!ModelState.IsValid)
return View("Login", loginViewModel);
return Redirect("/");
}
如您所见,属性ModelState.IsValid将告诉您请求是否无效,因此,当Post请求包含错误时,您可以返回相同的视图并在ValidationSummary中显示错误消息。这是视图的代码:
@using (Html.BeginForm("LoginForm", "Account"}))
{
@Html.ValidationSummary() // THIS WILL SHOW THE ERROR MESSAGES
@Html.AntiForgeryToken()
@Html.TextBoxFor(x => x.Email)
@Html.PasswordFor(x => x.Password)
<button type="submit">Submit</button>
}
答案 1 :(得分:0)
我们在asp.net mvc网络应用程序中使用PRG模式已有5年了。我们采用PRG的主要原因是支持浏览器导航(例如后退,前进)。我们的网络应用程序由客户使用,用于前台/后台操作。我们的典型网页流程从登录开始,然后通过许多列表/详细信息视图进行。我们还合并了部分视图,这些视图也有自己的视图模型。列表视图将具有用于导航的链接(GETS)。详细视图将具有用于导航的表单(POSTS)。
我们PRG的关键方面:
我们的PRG模式概述:
示例视图模式设置/获取方法
private void GetKeys() {
Hashtable viewModelKeys;
if (SdsuSessionState.Exists("RosterDetail"))
{
viewModelKeys = (Hashtable)SdsuSessionState.Get("RosterDetail");
EventId = (int)viewModelKeys["EventId"];
SessionNo = (int)viewModelKeys["SessionNo"];
viewModelKeys = null;
}
}
public static void SetKeys(int eventId, int sessionNo) {
Hashtable viewModelKeys = new Hashtable();
viewModelKeys.Add("EventId",eventId);
viewModelKeys.Add("SessionNo",sessionNo);
SdsuSessionState.Set("RosterDetail",viewModelKeys);
viewModelKeys = null;
}
样本控制器
[AcceptVerbs("Get")]
public ActionResult MenuLink(int eventId, int sessionNo, string submitButton) {
if (submitButton == RosterMenu.Button.PrintPreview) {
// P-R-G: set called viewmodel keys.
RosterDetail.SetKeys(eventId,sessionNo);
// Display page.
return RedirectToAction("Detail","Roster");
}
if (submitButton == RosterMenu.Button.Export) { etc ...}
}