asp.net-mvc – 自定义模型绑定器不验证模型
|
我开始玩knockout.js,在这样做的时候我使用了FromJsonAttribute(由Steve Sanderson创建).我遇到一个问题,自定义属性不执行模型验证.我把一个简单的例子放在一起 – 我知道它看起来像很多代码 – 但是基本的问题是如何强制在自定义模型绑定器中验证模型. using System.ComponentModel.DataAnnotations;
namespace BindingExamples.Models
{
public class Widget
{
[Required]
public string Name { get; set; }
}
}
这里是我的控制器: using System;
using System.Web.Mvc;
using BindingExamples.Models;
namespace BindingExamples.Controllers
{
public class WidgetController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(Widget w)
{
if(this.ModelState.IsValid)
{
TempData["message"] = String.Format("Thanks for inserting {0}",w.Name);
return RedirectToAction("Confirmation");
}
return View(w);
}
[HttpPost]
public ActionResult PostJson([koListEditor.FromJson] Widget w)
{
//the ModelState.IsValid even though the widget has an empty Name
if (this.ModelState.IsValid)
{
TempData["message"] = String.Format("Thanks for inserting {0}",w.Name);
return RedirectToAction("Confirmation");
}
return View(w);
}
public ActionResult Confirmation()
{
return View();
}
}
}
我的问题是模型总是在我的PostJson方法中有效.为了完整性,这里是FromJson属性的Sanderson代码: using System.Web.Mvc;
using System.Web.Script.Serialization;
namespace koListEditor
{
public class FromJsonAttribute : CustomModelBinderAttribute
{
private readonly static JavaScriptSerializer serializer = new JavaScriptSerializer();
public override IModelBinder GetBinder()
{
return new JsonModelBinder();
}
private class JsonModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
{
var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName];
if (string.IsNullOrEmpty(stringified))
return null;
var model = serializer.Deserialize(stringified,bindingContext.ModelType);
return model;
}
}
}
}
解决方法描述FromJsonAttribute只绑定到模型,如你所说,没有验证. 您可以向FromJsonAttribute添加验证,以便根据其DataAnnotations属性验证模型. 这可以使用TypeDescriptor类完成.
查看我的解决方案我已经测试了 解 private class JsonModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
{
var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName];
if (string.IsNullOrEmpty(stringified))
return null;
var model = serializer.Deserialize(stringified,bindingContext.ModelType);
// DataAnnotation Validation
var validationResult = from prop in TypeDescriptor.GetProperties(model).Cast<PropertyDescriptor>()
from attribute in prop.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(prop.GetValue(model))
select new { Propertie = prop.Name,ErrorMessage = attribute.FormatErrorMessage(string.Empty) };
// Add the ValidationResult's to the ModelState
foreach (var validationResultItem in validationResult)
bindingContext.ModelState.AddModelError(validationResultItem.Propertie,validationResultItem.ErrorMessage);
return model;
}
}
更多信息 > TypeDescriptor Class (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-web-api – WebAPI中的长时间运行任务
- asp.net-mvc – 不引人注意的MVC3验证组的复选框
- 如何设置起始页面在webconfig文件在asp.net c#
- asp.net-mvc – ASP.NET MVC中的Razor页面生命周期
- asp.net-mvc – Mvc验证正则表达式只有数字?
- asp.net-mvc – 我如何可以渲染局部视图在asp.net mvc 3
- asp.net-mvc – 为什么font-awesome在localhost而不是web上
- asp.net-mvc – 模型和视图模型之间的区别
- asp.net-mvc-2 – 使用Ninject返回null的HttpHandler属性注
- asp.net-mvc-3 – Mvc 3图像上传库
- asp.net-mvc – asp.net mvc针对不同操作的不同验
- ASP.NET将整数绑定到CheckBox的Checked字段
- asp.net – Microsoft WebMatrix和Visual Studio
- .net – RESTful WCF的裸最低配置
- asp.net-mvc-4 – 如何在MVC4 C#中安排任务?
- asp.net-mvc – 调试ASP.NET MVC源码?
- 我应该如何组织我的ASP.Net主题和常见的CSS文件
- asp.net-mvc – Asp.Net核心MVC6如何最初在Ident
- 什么{“d”:“”}表示在asp.net webservice响应
- .net – log4net – FileAppender在文件开头写入
