页面加载时会显示验证消息

时间:2011-03-18 03:42:29

标签: asp.net-mvc-2 validation

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

4 个答案:

答案 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
}