使用EntityFramework和MVC ModelBinding保存具有特殊字符的字段时出错

时间:2012-08-09 15:20:11

标签: c# asp.net-mvc entity-framework model-binding valueinjecter

我在ASP.NET MVC4应用程序中保存实体时遇到(2)字段的问题:

  • 电子邮件
  • 电话

如您所知,这些字段通常包含特殊字符@-。以下是来自控制器的代码,使用ValueInjecter通过模型绑定从水合对象中注入我的模型类:

public ActionResult Create(TestViewModel testViewModel)
{
  using (var context = new MyEntities())
  {
    var person = new Person();
    person.InjectFrom(testViewModel);
    context.Person.AddObject(person);
    context.SaveChanges();
  }
}

我得到的错误如下:

  

“字符串或二进制数据将被截断。语句已被删除   封端的“

好的第一眼你可能会说它是SQL中字段的大小,但真正的问题是伪装,因为那些特殊的字符。如果我为字段输入以下内容:

电话:11234565454514564561
电子邮件:blahblahblahblah

...然后的所有内容都有效。

但是,如果我输入:

电话:123-456-7890
电子邮件:test@wow.com

我收到有关“字符串或二进制数据将被截断”的错误。所以我找到了解决办法,但这似乎完全没必要,可能是错误的方式。如果我使用C#转义字符显式地将模型绑定对象中的值映射到实体,那么我的值将如下所示插入:

public ActionResult Create(TestViewModel testViewModel)
{
  using (var context = new MyEntities())
  {
    var person = new Person();
    person.InjectFrom(testViewModel);

    //Explicitly map items preserving special charachters
    person.EmailAddress = @testViewModel.EmailAddress;
    person.Phone = @testViewModel.Phone;

    context.Person.AddObject(person);
    context.SaveChanges();
  }
}
好的,老实说,我不知道罪魁祸首在哪里。这是MVC模型绑定问题,实体框架问题,C#交易还是ValueInjecter?我尝试在我的ViewModel属性上使用注释来指定PhoneEmail等数据类型,但这并没有阻止这个问题。只有通过在代码中明确地转义这些字符才能实现它。

我做错了什么,因为我知道电子邮件和带有特殊字符的手机等字段一直保存到EF和MVC?我有什么办法可以防止每次有特殊字符的值时都必须使用这些代码行?

谢谢!

1 个答案:

答案 0 :(得分:2)

在典型的时尚中,我在发布了我花了3个小时试图弄明白的问题后10秒钟才弄清楚:

正如@CodeMaster所指出的那样,这些代码行无论如何都是不正确的。我开始玩其他一些领域,我找出了罪魁祸首。

为了简洁起见,我给出的代码简洁,但我注入了(2)不同的人:人和接触。结果是两个表都有一个'Title'字段。我只专注于Person表中的'Title'字段,其长度为'50',如下所示:

<Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" />

事实证明,Contact字段有我不知道的确切smae字段,但只有'8'的长度如下:

<Property Name="Title" Type="nvarchar" MaxLength="8" />

这导致错误,确实合法。当我只想要一个实体并导致问题时,ValueInjecter将相同的单个'Title'值映射到两个实体。必须要小心,因为ValueInjectoer不区分名称是否匹配(因为它不应该),但这会导致我的问题。