0

我正在尝试在我的控制器中使用一种方法来帮助验证(注意:我不能DataAnnotations在我的情况下使用)。但是我弄错了逻辑/代码。

[Serializable]用于处理向导中的步骤,因此我的控制器操作将转到详细信息 > 确认 > 提交。控制器操作在我的控制器中采用一个序列化参数,该参数是从视图模型(下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;
    }

    return ModelState.IsValid
}

这是我在控制器中的三个操作(详细信息 > 确认 > 提交):

public ActionResult Details(string nextButton)
{
    if ((nextButton != null) && ModelState.IsValid)
        return RedirectToAction("Confirm");
    return View(myData);
}

public ActionResult Confirm(string backButton, string nextButton)
{
    if (backButton != null)
        return RedirectToAction("Details");
    else if ((nextButton != null) && ModelState.IsValid)
    {
        // code to add to DB
        return RedirectToAction("Submitted");
    }
    else
        return View(myData);
}

public ActionResult Submitted()
{
    // code to send e-mail
    return View(myData);
}

过去我确实使用过DataAnnotations类似的属性[Required],并且ModelState检查会毫无问题地触发。但我现在不能使用它,因此方法DetailsValidation. 但是,如果我因此将其应用于Details操作(或使用HttpPost或将其放在returnConfirm 操作之前):

public ActionResult Details(string nextButton)
{
    if (DetailsValidation())
    {
        if ((nextButton != null) && ModelState.IsValid)
            return RedirectToAction("Confirm");
    }
        return View(myData);
}

使用上面的代码,模型验证会在页面加载时立即触发(如果我HttpPost在单独的 DetailsPOST 操作中使用,但不会发生)。

现在,如果我使用HttpPost(一个返回视图的普通Get操作,然后是一个Post标记为 DetailsPOST 的单独操作),除了我创建了两个新问题之外,我可以解决这个问题。

首先,如果我完成提交并重新加载详细信息页面以继续测试,它将使用先前的输入重新填充表单。

其次,如果我使用单选按钮列表,而不是设置为实际选择的单选按钮,它会设置为最后一个单选按钮。诡异的。

关于如何度过这个难关的任何想法。我只是不知道如何开始DetailsValidation工作(不使用单独的HttpPost操作)。否则,我能想到的唯一另一件事就是在DetailsValidation控制器操作中进行所有检查,这将产生一些类似意大利面条的代码。

谢谢。

跟进问题:

ModelState.IsValid从 Action 中删除并用我的私有验证方法替换它是否合适,如下所示:

public ActionResult Details(string nextButton)
{
    if ((nextButton != null) && DetailsValidation())
        return RedirectToAction("Confirm");
    return View(myData);
}

我觉得我会失去 的好处ModelState.IsValid,或者可能是“不可以”。

否则,这是否可行:

public ActionResult Details(string nextButton)
{
    if ((nextButton != null) && ModelState.IsValid)
        if DetailsValidation()
            return RedirectToAction("Confirm");
    return View(myData);
}

但这似乎不对。

4

1 回答 1

0

您需要继承类 ValidationAttribute 并覆盖方法 IsValid。

比您可以通过对 ValidationContext 对象的操作来处理所有逻辑

于 2013-09-13T00:28:12.747 回答