我在ASP.NET MVC 2.0中验证有问题。我在Controller中使用相同的Action来执行用户请求 例如:
public ActionResult Index(ReportModel model)
{
if (!model.IsInitialDisplay && ModelState.IsValid)
{
model.Result = service.GetResult(model);
}
return View(model);
}
在ReportModel中,我定义了一个标志IsInitialDisplay来确定页面是否初始显示:
public class ReportModel
{
[Required(ErrorMessage = "*")]
public string Criteria { get; set; }
public bool IsInitialDisplay { get; set; }
public ReportResult Result { get; set; }
public ReportModel()
{
IsInitialDisplay = true;
}
}
在View中,我使用以下代码:
<% using (Html.BeginForm())
{ %>
<table>
<tr>
<th>
Criteria:
</th>
<td>
<%= Html.TextBox("Criteria", "") %>
<%= Html.ValidationMessage("Criteria") %>
</td>
</tr>
</table>
<br />
<input type="submit" value="Submit" />
<%= Html.Hidden("IsInitialDisplay", false) %>
<% } %>
正如我所料,如果用户没有为Criteria输入任何值并单击Submit按钮,将显示验证错误消息。
但验证错误信息总是显示在初始页面加载上,我不知道如何防止它?
有人知道吗?谢谢,
[更新]
我已经更新了我的Action方法,如下所示,它看起来很好:
public ActionResult Index(ReportModel model)
{
// Collecting some commons data here...
if (model.IsInitialDisplay)
{
ModelState.Clear();
}
else if (ModelState.IsValid)
{
model.Result = service.GetResult(model);
}
return View(model);
}
答案 0 :(得分:32)
在初始页面加载时显示错误消息的原因是因为控制器操作将ReportModel
模型作为参数。当您首次使用/Home/Index
访问此操作时,您没有传递任何参数,并且当默认模型绑定器尝试绑定到ReportModel
实例时,它会触发验证错误。
在呈现和处理表单提交时使用相同的操作是一种不好的做法,但如果你真的想这样做,你可以尝试这样:
public ActionResult Index(bool? isInitialDisplay)
{
if (isInitialDisplay.HasValue && !isInitialDisplay.Value)
{
var model = new ReportModel();
UpdateModel(model);
if (ModelState.IsValid)
{
model.Result = service.GetResult(model);
}
return View(model);
}
// Initial request
return View(new ReportModel());
}
在这种情况下,您不再需要模型上的IsInitialDisplay
属性,也不需要将其设置为true的构造函数。
这就是说,这是推荐的方式:
public ActionResult Index()
{
var model = new ReportModel();
return View(model);
}
[HttpPost]
public ActionResult Index(ReportModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
model.Result = service.GetResult(model);
return View(model);
}
答案 1 :(得分:5)
这是一个结合了一些好答案的简单解决方案:
[HttpGet]
public ActionResult Index(ReportsModel model)
{
ModelState.Clear(); //clears the validation
return View(model);
}
[HttpPost]
public ActionResult Index(ReportsModel model, string unused)
{
...
}
这使用http方法确定它是否是第一次加载(如Darin的解决方案)。
最重要的是,它有MVC构建你的控制器而不是自己手动新建一个。如果您使用依赖项注入或者通过查询字符串(如嵌套资源ID)有其他上下文数据,这一点很重要。
答案 2 :(得分:0)
模型
public class ReportModel
{
[Required(ErrorMessage = "*")]
public string Criteria { get; set; }
}
查看
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm())
{ %>
<%= Html.TextBoxFor(model => model.Criteria) %>
<%= Html.ValidationMessageFor(model => model.Criteria) %>
<input type="submit" value="Submit" />
<% } %>
工作正常
答案 3 :(得分:0)
如果您需要使用相同的操作名称来处理表单提交,则应始终使用以下技术:
[HttpGet]
public ActionResult Index()
{
/* Just returning the view. No validation will happen because we are not passing a parameter*/
return View();
}
[HttpPost]
public ActionResult Index(ReportsModel model)
{
//Another post action for validation
}