错误验证表字段不允许空值的模型

时间:2010-09-28 21:06:35

标签: c# asp.net-mvc entity-framework asp.net-mvc-2

我正在使用.NET 4.0和实体框架来进行一些服务器端验证。我有一个名为“Contacts”的简单表格,如下所示:

ID int不允许空值
FirstName nvarchar(50)不允许空值
SecondName nvarchar(50)不允许空值
MobileNumber nvarchar(50)不允许空值
HomeNumber nvarchar(50)允许空值

我有一个ContactController和一个类型为Contact的强类型视图,它显示编辑文本框。当我点击“创建”尝试创建一个新的联系人时,我有一个控制器方法,如下所示:

    [HttpPost]
    public ActionResult Create(Contact contact)
    {

        if (ModelState.IsValid)
        {

            ContactService.CreateContact(contact);
            RedirectToAction("Index");
        }

        return View();

    }

如果我按下按钮而没有输入任何内容,我的代码会在到达此处之前中断。错误来自此行的Contacts.Designer.cs:

  

_FirstName = StructuralObject.SetValidValue(value,   假);

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            OnFirstNameChanging(value);
            ReportPropertyChanging("FirstName");
            _FirstName = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("FirstName");
            OnFirstNameChanged();
        }
    }

这是一个ConstraintException,它说这个属性不能设置为空值。如果我将字段设置为all接受空值,则代码可以正常工作,并且不会发生此错误,并且会检查模型以查看它是否像预期的那样有效。这里出了什么问题?

由于

1 个答案:

答案 0 :(得分:1)

这是解决方案。我不得不添加

  

[DisplayFormat(ConvertEmptyStringToNull = false)]

该字段的注释不允许空值。有关此错误的完整说明here

[MetadataType(typeof(Contact_Validate))]
public partial class Contact
{



    public string FullName()
    {

        return _FirstName + " " + _SecondName;
    }


}

public class Contact_Validate
{
    [Required]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string FirstName { get; set; }

    [Required]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string SecondName { get; set; }

    [Required]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string MobileNumber { get; set; }
    public string HomeNumber { get; set; }

}