当前位置:  开发笔记 > 后端 > 正文

ASP.NET MVC UpdateModel为空属性

如何解决《ASP.NETMVCUpdateModel为空属性》经验,为你挑选了1个好方法。

鉴于以下模型,

public class A
{
    public string Name { get; set; }
}

public class B
{
    public string Address { get; set; }
    public A InstanceOfA { get; set; }
}

视图,

<%= Html.TextBox("A.Name") %>

和控制器

UpdateModel(b, collection.ToValueProvider());

我的b实例将包含A的属性,其中包含Name的空字符串.

无论如何,如果没有为name输入值,UpdateModel是否将A属性设置为null?

为了澄清,这是一个简单的案例,我的真实世界场景包含具有数百种此类属性的数据模型.这些数据模型的定义不在我手中.因此,我需要针对一般情况的解决方案,即如果没有输入值,则不创建属性.

进一步澄清:我需要这个在编辑场景中工作,也就是说,将A.Name设置为"foo"的b实例编辑为将A.Name设置为"",我希望A为null.



1> Andrew Peter..:

我刚刚发现了这种行为(由于检查约束而意外),我认为这是一个错误.我想知道有多少开发人员现在无意中将空字符串保存到他们的db而不是null?:-)

无论如何,我将更多地探讨这一点,看看是否有更好的解决方案.

更新:

这是一个解决方案:

using System.ComponentModel;
using System.Web.Mvc;

namespace CustomerWebsite.Mvc
{
  public sealed class EmptyStringToNullModelBinder : DefaultModelBinder
  {
    protected override void SetProperty(ControllerContext controllerContext,
      ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
    {
      if ((value != null)
          && (value.GetType() == typeof(string)
              && ((string)value).Length == 0))
      {
        value = null;
      }

      base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
    }
  }
}

在Application_Start中放这个:

ModelBinders.Binders.DefaultBinder = new EmptyStringToNullModelBinder();

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有