我正在尝试在我的控制器中使用一种方法来帮助验证(注意:我不能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
Confirm 操作之前):
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);
}
但这似乎不对。