我以前没有[HttpPost]
以这种方式表达我的观点:
public ActionResult Details(string nextButton)
{
if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("Confirm");
return View(myData);
}
注意: myData
是我的序列化视图模型(我不确定这是否是问题所在)。
我以前也在我的属性上使用 DataAnnotations,例如[Required]
. 如果视图中的任何字段.cshtml
验证失败(即,在必填文本框中没有输入),单击“下一个按钮”时,将向用户显示标准客户端验证错误(以及之前填写的项目)仍需填写)。
如果用户更正了错误并提交了信息,他们可以稍后重新访问该页面并且该页面将是空白的(即,如果他们提交,他们之前的输入将不可见)。
现在,为了本地化文本,我不得不暂时离开DataAnnotations
并将验证放在我的控制器中。所以我也因此开始使用[HttpPost]
:
public ActionResult Details()
{
return View(myData);
}
[HttpPost]
[ActionName("Details")]
public ActionResult DetailsPOST(string nextButton)
{
if (DetailsValidation())
{
if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("Confirm");
}
return View(myData);
}
...
private bool DetailsValidation()
{
bool validate = true;
if (String.IsNullOrEmpty(myData.FirstName))
{
AddModelError("FirstName", T("Please specify a First Name."));
validate = false;
}
if (!validate)
return false;
if (myData.FirstName.Length > 25)
{
AddModelError("FirstName",
T("First Name cannot be more than 25 letters."));
}
return ModelState.IsValid;
}
上面的代码一直与我的验证一起提交。但是,现在的问题是,如果用户返回详细信息视图,他们输入的数据会填充文本框,而使用原始方式(无[HttpPost]
或特殊验证)如果用户返回详细信息视图,他们将看到一个新的页面(文本框中没有他们的数据)。
对不起,如果这不清楚。但是有没有办法在提交后清除文本框,所以如果用户返回一个新页面?或者,鉴于我做事的新方式,这只是我必须处理的事情。
谢谢。
更新我如何myData
在控制器中创建:
private MyViewModel myData;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var serialized = Request.Form["myData"];
if (serialized != null) //Form was posted containing serialized data
{
myData = (MyViewModel)new MvcSerializer()
.Deserialize(serialized, SerializationMode.Signed);
TryUpdateModel(myUsData);
}
else
myData = (MyViewModel)TempData["myData"] ?? new MyViewModel();
TempData.Keep();
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.Result is RedirectToRouteResult)
TempData["myData"] = myData;
}
我将其用于向导,将数据传递给后续视图(详细信息 > 确认 > 提交)。