从razor视图我使用jquery将js对象发送到mvc控制器。我使用jquery post方法而不是razors形式的原因是我需要管理某些字段的动态输入。在视图中,某些字段(inputtextbox)被动态添加到视图中(从0到10),我使用页面上的js管理该解决方案。
private void myForm_Load(object sender, EventArgs e)
{
DialogResult dialogOpen = MessageBox.Show("Use the navigation menu to get started.", "Welcome!", MessageBoxButtons.OK);
}
在服务器端,mvc接收该模型,如果出现某些错误,我想将此对象返回给视图。
var myJsObj = ...
$.ajax({
type: 'POST',
traditional: true,
contentType: 'application/json',
url: '/MyController/SomeAction',
data: JSON.stringify({ model: myJsObj}),
success: function () {
}
});
我有剃刀内部视图
[HttpPost]
public ActionResult SomeAction(MyModel model)
{
if(!ModelState.IsValid)
{
ModelState.AddModelError("", "Error occured!");
return View(model);
}
return RedirectToAction("Index");
}
但由于我正在使用jquery帖子,我不知道如何接收回到视图并显示错误,就像我会使用常规剃刀形式。或者,如果您知道在剃刀视图上管理动态添加的输入框的更好方法,请发布。请帮忙。
答案 0 :(得分:1)
这是我为显示动态输入错误所做的工作。首先,看看这篇文章,让你更好地理解。我修改了我的代码以更好地满足我的需求,但您可以检查它是否适用于您的应用程序。 use-asp-net-mvc-validation-with-jquery-ajax。 然后我将在ajax post错误回调中使用返回结果。它会在验证错误时返回代码400“错误请求”。验证器变量是表单验证器对象。
error: function (xhr, textStatus, errorThrown) {
var statusCode = parseInt(xhr.status);
if (statusCode == 400) {
var data = $.parseJSON(xhr.responseText);
var message = "";
$.each(data, function (i, item) {
var propertyName = "" + item.key + "";
if ($("input[name='" + item.key + "']").length > 0) {
var errorObj = {};
errorObj[item.key] = item.error;
validator.showErrors(errorObj);
}
else {
message += "<div>" + item.key + ": " + item.error + "</div>";
}
});
if (message != "") {
//display message
}
}
}
我希望这会有所帮助。祝你好运。
答案 1 :(得分:1)
我想你在这里有几个选择:
$.ajax({
type: 'POST',
traditional: true,
contentType: 'application/json',
url: '/MyController/SomeAction',
data: JSON.stringify({ model: myJsObj}),
success: function (data) {
// This is the case where the MVC action found model validation
// errors, and so it is responding with an HTML document that
// shows the errors.
var returnedBodyHtml = $(data).find('body').html();
$('body').html(returnedBodyHtml);
}
});
(那是未经测试的代码,因此您可能需要进行一些调试。)但是此代码不处理服务器使用重定向响应的情况(在成功验证的情况下)。因此,请查看this post以了解其中的一些选项。
<input type="text" name="myDynamicallyGeneratedInput[0]" />
<input type="text" name="myDynamicallyGeneratedInput[1]" />
<input type="text" name="myDynamicallyGeneratedInput[2]" />
<input type="text" name="myDynamicallyGeneratedInput[3]" />
然后您的表单提交仍然有效,只要在服务器端,您的MyModel类具有相应的属性:
class MyModel
{
public List<string> MyDynamicallyGeneratedInput {get; set;}
}