【问题标题】:C# ASPNET MVC - How do you use ModelState.IsValid in a jquery/ajax postback?C# ASPNET MVC - 如何在 jquery/ajax 回发中使用 ModelState.IsValid?
【发布时间】:2010-05-02 22:13:20
【问题描述】:

据我所知,ModelState.IsValid 仅由 MVC 框架在完整回发时计算,是这样吗?

我有一个这样的 jquery 回发:

var url = "/path/to/controller/myaction";
var id = $("#Id").val();
var somedata = $("#somedata").val();  // repeated for every textbox
$.post(url, { id: id, somedata: somedata },
function (data) {
  // etc
});

控制器动作如下:

public JsonResult MyAction(MyModel modelInstance) 
{
    if (ModelState.IsValid)
    {
        // ... ModelState.IsValid is always true, even when there is invalid data
    }
}

但这似乎不会触发 ModelState.IsValid。例如,如果 somedata 长度为 5 个字符,但 DataAnnotation 显示 [StringLength(3)] - 在这种情况下 ModelStae.IsValid 仍然为 true,因为它尚未被触发。

在制作 jquery/ajax 帖子而不是完整帖子时,我需要做些什么特别的事情吗?

谢谢!

【问题讨论】:

    标签: c# asp.net-mvc jquery data-annotations


    【解决方案1】:

    不,没有什么特别的事情要做。您的发布逻辑可能有问题。尝试使用jQuery Form Plugin,而不是手动设置发布的值。它使 ajax 发布更容易,并有助于摆脱奇怪的错误。

    我刚刚准备了一个简单的例子,它运行良好(它使用 jQuery 形式)(编辑:$.post('/Login/Test3', { AAA: $('#AAA').val() } ); 也很好用):

    控制器:

    public class Test3ViewModel
    {
        [StringLength(3)]
        public string AAA { get; set; }
    }
    
    [HttpPost]
    public int Test3(Test3ViewModel model)
    {
        if (ModelState.IsValid)
        {
            return 1;
        }
        return 2;
    }
    

    查看:

    <form method="post" action="/Login/Test3" id="form_test3">
        <%= Html.TextBox( "AAA" ) %>
    <input type="submit" value="OK" />
    </form>
    
    <script type="text/javascript">
        $(document).ready(
            function() {
                $('#form_test3').ajaxForm(function() {
                    alert("Post works fine:)");
                });
            }
        );
    </script>
    

    【讨论】:

    • 我已经比较了您的样本,看看可能有什么问题,但没有发现问题。我的代码对于表单操作和 $.post url 确实有不同的 url - 但使它们相同没有区别。
    • 一个可能的区别:我没有回发所有模型字段。某些字段可以为空,并且不会在此方法中更新,因此不会回发。你认为这会有所作为吗?
    • 我注意到的另一件事:在我的控制器操作中,模型对象正确地填充了发布的数据。但是 ModelState 是空的(.count = 0)。
    • @JK:也许你的项目中有一些东西与 ModelState 混淆了。也许某些重定向会丢失 ModelState 值。我不知道。您可以创建新项目并检查它是否在那里工作。如果它有效,您必须查看您的代码并找到问题,因为它没有连接到框架。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多