我的帖子中有很多类似的帖子,但没有一个我遇到的确切问题......
我的要求是提示用户输入第一个&列表中人员的姓氏与用户想要的一样多。 第一次加载视图时,它会显示一个空表单。用户填写它,然后如果需要,请求加载有关下一个人的数据,等等。用户一次填充一个人的数据,然后再加载下一个人。如果尝试,则默认验证会阻止他执行此操作,直到所有字段都完成为止。
因此,我有两个具有相同名称但不同值的提交按钮,一个用于通过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已加载到我的代码中。
谢谢!
答案 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" />