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

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)


ben*_*ree 5

这是一个结合了一些好答案的简单解决方案:

[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)传入其他上下文数据,这一点很重要.


Kro*_*nos 0

模型

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)

做工精细