使用控制器内部的方法验证输入

时间:2013-09-12 21:16:50

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我试图在我的控制器中使用一个方法来帮助验证(注意:在我的情况下我不能使用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或将其放在return之前的确认操作中):

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

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

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

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

其次,如果我使用单选按钮列表,而不是设置在所选的实际单选按钮,它将被设置为最后一个单选按钮。怪异。

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

感谢。

关注问题:

从Action中删除ModelState.IsValid并将其替换为我的私有验证方法是否合适:

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);
}

但这似乎不对。

1 个答案:

答案 0 :(得分:0)

您需要继承ValidationAttribute类并重写方法IsValid。

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