gpt4 book ai didi

c# - 如何在 MVC Web API 发布方法中将 ModelState 错误返回给 Kendo 网格?

转载 作者:可可西里 更新时间:2023-11-01 09:05:17 35 4
gpt4 key购买 nike

我一直没能找到一个 Kendo + MVC Web API 的例子,其中 post/update 方法返回验证错误。看起来没有可以使以下代码工作的 Kendo 扩展。

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 返回 ModelState 错误的最佳方式是什么?

最佳答案

这对我们来说太棒了,尽管我们从来没有看到 ModelState 错误并且通常会忽略那部分......

剑道网格

@model SysMaintViewModel
@(Html.Kendo().Grid<BuildingModel>()
.Name("BuildingsGrid")
.Columns(columns =>
[Stuff Omitted]
.DataSource(dataSource => dataSource
.Ajax()
>>> .Events(e => e.Error("error_handler"))
.Model(model =>
{
model.Id(m => m.Id);
model.Field(m => m.ProjectId).DefaultValue(Model.ProjectId);
model.Field(m => m.IsActive).DefaultValue(true);
})
.Create(create => create.Action("CreateBuilding", "SysMaint"))
.Read(read => read.Action("ReadBuildings", "SysMaint", Model))
.Update(update => update.Action("UpdateBuilding", "SysMaint"))
.Destroy(destroy => destroy.Action("DestroyBuilding", "SysMaint"))
)
)

Controller

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

更新 Controller

我们发现这个流程工作得更好一点,它向 Elmah 添加了错误日志记录(一般示例)...

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

常用JavaScript和Kendo Window

@(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);
}
}

奖金

我们的 BaseModel 还有一个 ErrorMessage 参数,我们将其他类型的错误放入该参数以检查页面加载是否应为其他任何内容打开相同的警报窗口。

$(document).ready(function () {
if ("@Model.ErrorMessage" != "") {
showAlertWindow("@Model.ErrorMessage");
}
});

当出现错误时,这有一个非常好的演示 - 让我们的内部用户不会 panic 。希望对您有所帮助。

关于c# - 如何在 MVC Web API 发布方法中将 ModelState 错误返回给 Kendo 网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17790107/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com