我试图在我的控制器中使用一个方法来帮助验证(注意:在我的情况下我不能使用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);
}
但这似乎不对。
答案 0 :(得分:0)
您需要继承ValidationAttribute类并重写方法IsValid。
您可以通过操作ValidationContext对象来处理所有逻辑