gpt4 book ai didi

asp.net-mvc-2 - 在自定义模型绑定(bind)器中设置 ModelState 值

转载 作者:行者123 更新时间:2023-12-02 03:06:20 25 4
gpt4 key购买 nike

我在 ASP.NET MVC 2 中使用自定义模型绑定(bind)器,如下所示:

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}

BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext);
if(string.IsNullOrWhiteSpace(obj.Slug))
{
// creating new object
obj.Created = obj.Modified = DateTime.Now;
obj.ModifiedBy = obj.CreatedBy = controllerContext.HttpContext.User.Identity.Name;
// slug is not provided thru UI, derivate it from Title; property setter removes chars that are not allowed
obj.Slug = obj.Title;
ModelStateDictionary modelStateDictionary = bindingContext.ModelState;
modelStateDictionary.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));
...

当我从这个绑定(bind)器返回到 Controller 操作时,作为操作参数提供的业务对象被正确更改(行 obj.Created = .... 工作)。

但是,ModelState 并未更新。我知道这一点是因为我的业务对象的 Slug 属性上有必需的,尽管我在自定义模型绑定(bind)器中更改了 ModelStateDictionary,为其提供了一个 Slug(如上所示),但 ModelState.IsValid 仍然为 false。

如果我将 ModelState["Slug"] 放入调试 session 中的“监视”窗口中,它会显示它有错误 (1),因此显然它是空的,因此会失败。

如何正确更改自定义模型绑定(bind)器代码中的 ModelState?

最佳答案

显然,一旦更改某个键的值,就无法重新验证 ModelState。 IsValid 仍然为 false,因为为某个键设置新值不会触发重新验证。

解决方案是首先删除触发 IsValid 为 false 的键,然后重新创建它并为其赋值。当您执行此操作时,ModelState 会自动重新验证,如果一切正常,IsValid 将返回 true。

像这样:

bindingContext.ModelState.Remove("Slug");
bindingContext.ModelState.Add("Slug", new ModelState());
bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));

关于asp.net-mvc-2 - 在自定义模型绑定(bind)器中设置 ModelState 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588588/

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