C# 如何在MVC Web API post方法中将ModelState错误返回到Kendo网格?

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) {

我还没有找到一个Kendo+MVCWebAPI的例子,其中post/update方法返回验证错误。看起来没有剑道扩展可以让下面的代码正常工作

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");
    }
});