从ajax发布时,MVC ModelState.isValid始终为true

时间:2014-06-06 19:55:59

标签: jquery ajax model-view-controller modelstate

我的帖子中有很多类似的帖子,但没有一个我遇到的确切问题......

我的要求是提示用户输入第一个&列表中人员的姓氏与用户想要的一样多。 第一次加载视图时,它会显示一个空表单。用户填写它,然后如果需要,请求加载有关下一个人的数据,等等。用户一次填充一个人的数据,然后再加载下一个人。如果尝试,则默认验证会阻止他执行此操作,直到所有字段都完成为止。

因此,我有两个具有相同名称但不同值的提交按钮,一个用于通过ajax请求下一部分并将其添加到模型中的列表中,另一个用于完成请求。 httpost方法基于按钮的名称,决定采取哪种操作(添加更多或完成交易)。

但我有一个问题,当我通过json在我的控制器中调用我的httppost动作方法时,模型绑定行为不正确;因此,即使我将字段留空,ModelState.IsValid也始终等于true。

我在视图中的表单有一个包含以下内容的div:

    <div>
        <label for="FirstName">First Name</label>
        <div>
            @Html.EditorFor(model => model.Persons[i].FirstName)
            @Html.ValidationMessageFor(model => model.Persons[i].FirstName)
        </div>
    </div>

    <div>
        <label for="LastName">Last Name</label>
        <div>
            @Html.EditorFor(model => model.Persons[i].LastName)
            @Html.ValidationMessageFor(model => model.Persons[i].LastName)
        </div>
    </div>

我有这两个按钮都提交:

        <button type="submit" name="actionType" value="AddPerson"  onclick="addPerson();">Add Another</button>
        <button type="submit" name="actionType" value="Done">Done</button>

我的模型看起来像这样:

    [Required(ErrorMessage = "First Name is required.")]
    [Display(Name = "First Name")]
    public String FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is required.")]
    [Display(Name = "Last Name")]
    public String LastName { get; set; }

和我的帖子方法:

[HttpPost]
public ActionResult AddPersonMethod(MyModel mm, string actionType)
{
    if (actionType.Equals("AddPerson"))
    {
        if (ModelState.IsValid)
        {
            // add item to the list in the model
        }
    }
    return View(mm);
}

我尝试在第一个按钮上设置ajax:

function addPerson()
{
    $.ajax({
        url: "myurl",
        type: "POST",
        data: { actionType: 'AddPerson' },
        success: function () {
            console.log('ajax succeeded');
        }
    });
}

这将针对required进行正确的验证,但在控制器中使用ModelState.IsValid = true继续控制器中的httppost(它应该在验证错误时停止)。 输入错误输入时如何停止?当它使用ajax发布方法时,将ModelState.IsValid正确设置为false!?

仅供参考:我的jquery.validate.js和jquery.validate.unobtrusive.js已加载到我的代码中。

谢谢!

1 个答案:

答案 0 :(得分:1)

原因主要是因为我没有在ajax调用的数据中包含这个:

$form.serialize()

之后我的ajax还需要进一步调整。这是一个完美的ajax调用的一个很好的例子,带有有用的注释: http://www.codeproject.com/Tips/289820/Post-a-form-using-Ajax-instead-of-Normal-Post

我的启动按钮没有必须连接到某个事件,它可能很简单:

<input type="submit" name="actionType" value="AddPerson" />