C# 如何在MVC Web API post方法中将ModelState错误返回到Kendo网格?
我还没有找到一个Kendo+MVCWebAPI的例子,其中post/update方法返回验证错误。看起来没有剑道扩展可以让下面的代码正常工作C# 如何在MVC Web API post方法中将ModelState错误返回到Kendo网格?,c#,validation,asp.net-web-api,kendo-ui,C#,Validation,Asp.net Web Api,Kendo Ui,我还没有找到一个Kendo+MVCWebAPI的例子,其中post/update方法返回验证错误。看起来没有剑道扩展可以让下面的代码正常工作 public HttpResponseMessage Post([ModelBinder(typeof(Prototype.WebApi.ModelBinders.DataSourceRequestModelBinder))][DataSourceRequest] DataSourceRequest request, User user) {
public HttpResponseMessage Post([ModelBinder(typeof(Prototype.WebApi.ModelBinders.DataSourceRequestModelBinder))][DataSourceRequest] DataSourceRequest request, User user)
{
if (this.ModelState.IsValid)
{
//save
}
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, this.ModelState.ToDataSourceResult());
}
因为此上下文中的ModelState是System.Web.Http.ModelBinding.ModelStateDictionary,而Kendo扩展需要System.Web.Mvc.ModelStateDictionary
那么,将模型状态错误从Web API返回到Kendo的最佳方法是什么呢?这对我们来说非常有用,尽管我们从未看到模型状态错误,通常会忽略这一部分 剑道格网 奖金 我们的BaseModel还有一个ErrorMessage参数,我们将其他类型的错误放入该参数中,用于检查页面加载是否应该为其他任何内容打开相同的警报窗口
$(document).ready(function () {
if ("@Model.ErrorMessage" != "") {
showAlertWindow("@Model.ErrorMessage");
}
});
当抛出错误时,这是一个非常好的演示—使我们的内部用户不会惊慌失措。我希望这对您有所帮助。谢谢,但您的控制器是常规MVC控制器还是web api控制器(即继承自ApiController)。我的观点是,这一行不会在Web API中编译,因为ApiController中的ModelState不同于MVC控制器。var buildings=(新列表{building}).ToDataSourceResult(请求,模型状态);简而言之,使用:
ModelState.addmodeleror(string.Empty,errMsg)
并抓取error\u handler
JavaScript函数,将.Events(e=>e.error(“error\u handler”))
添加到网格中。在error\u handler
中,您只需弹出一个alert()
,而不是showAlertWindow(消息)代码>。希望我能投票100次!很好的解释,效果很好。
[HttpPost]
public JsonResult UpdateBuilding([DataSourceRequest]DataSourceRequest request, BuildingModel modelIn)
{
var building = new BuildingModel();
if (ModelState.IsValid)
{
try
{
building = _presentationService.UpdateBuilding(modelIn);
}
catch (Exception e)
{
ModelState.AddModelError(string.Empty, e.Message);
}
}
else
{
var errMsg = ModelState.Values
.Where(x => x.Errors.Count >= 1)
.Aggregate("Model State Errors: ", (current, err) => current + err.Errors.Select(x => x.ErrorMessage));
ModelState.AddModelError(string.Empty, errMsg);
}
var buildings = (new List<BuildingModel> {building}).ToDataSourceResult(request, ModelState);
return Json(buildings, JsonRequestBehavior.AllowGet);
}
[HttpPost]
public JsonResult Update([DataSourceRequest]DataSourceRequest request, MyObjectModel modelIn)
{
try
{
if (ModelState.IsValid)
{
var myObject = _presentationService.Update(modelIn, User.Identity.Name);
var myObjectList = new List<MyObjectModel> { myObject };
return Json(myObjectList.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
}
else
{
var myObjectList = new List<MyObjectModel> { modelIn };
return Json(myObjectList.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
}
}
catch (Exception e)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(e);
ModelState.AddModelError(string.Empty, e.Message);
var myObjectList = new List<MyObjectModel> { modelIn };
return Json(myObjectList.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
}
}
@(Html.Kendo().Window()
.Name("alertWindow")
.Title("Status Message from Server")
.Draggable()
.Resizable()
.Width(400)
.Height(200)
.Modal(true)
.Visible(false)
)
function showAlertWindow(message) {
var alertWindow = $('#alertWindow').data('kendoWindow');
alertWindow.content(message);
alertWindow.refresh();
alertWindow.center();
alertWindow.open();
}
function error_handler(e) {
if (e.errors) {
var message = "Errors:\n";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
showAlertWindow(message);
}
}
$(document).ready(function () {
if ("@Model.ErrorMessage" != "") {
showAlertWindow("@Model.ErrorMessage");
}
});