aqu*_*ium 11 validation asp.net-mvc-2
我在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);
}
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
在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) %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
正如我所料,如果用户没有为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);
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 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());
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不再需要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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个结合了一些好答案的简单解决方案:
[HttpGet]
public ActionResult Index(ReportsModel model)
{
ModelState.Clear(); //clears the validation
return View(model);
}
[HttpPost]
public ActionResult Index(ReportsModel model, string unused)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这使用http方法来确定它是否是第一次加载(如Darin的解决方案).
最重要的是,它有MVC构建你的控制器而不是自己手动新建一个.如果您使用依赖项注入或者通过查询字符串(如嵌套资源ID)传入其他上下文数据,这一点很重要.
模型
public class ReportModel
{
[Required(ErrorMessage = "*")]
public string Criteria { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
看法
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm())
{ %>
<%= Html.TextBoxFor(model => model.Criteria) %>
<%= Html.ValidationMessageFor(model => model.Criteria) %>
<input type="submit" value="Submit" />
<% } %>
Run Code Online (Sandbox Code Playgroud)
做工精细
归档时间: |
|
查看次数: |
12582 次 |
最近记录: |