0

我以前没有[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;
}

我将其用于向导,将数据传递给后续视图(详细信息 > 确认 > 提交)。

4

2 回答 2

0

你是如何myData在这个动作方法中初始化的?您是否使用数据库中的数据填充它?

public ActionResult Details()
{
    return View(myData);
}

如果是这样,您可以初始化一个空的 myData 并将其传递给您的视图:

public ActionResult Details()
{
    var myData = new UserData();
    return View(myData);
}
于 2013-09-05T16:20:21.643 回答
0

在这个问题上没有真正的解决方案,所以看来我只能接受这种行为。

于 2013-09-07T14:20:23.733 回答