加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – ModelState.IsValid返回true,即使必需的字符串为null

发布时间:2020-12-16 03:49:49 所属栏目:asp.Net 来源:网络整理
导读:情况 我有一个LINQ-TO-SQL模型,其中包含一个包含三列的表.通常的ID(标识,自动生成),然后是int类型的A和类型为varchar(MAX)的B.所有列都在数据库中定义为NOT NULL. 在WebForms页面上,我声明了一个绑定到项目的DetailsView: asp:ValidationSummary runat="ser
情况

我有一个LINQ-TO-SQL模型,其中包含一个包含三列的表.通常的ID(标识,自动生成),然后是int类型的A和类型为varchar(MAX)的B.所有列都在数据库中定义为NOT NULL.

在WebForms页面上,我声明了一个绑定到项目的DetailsView:

<asp:ValidationSummary runat="server" ShowModelStateErrors="true" />
<asp:DetailsView DataKeyNames="Id" runat="server" ItemType="test.MyTable"
    SelectMethod="..." UpdateMethod="...">
      <Fields>
        <asp:DynamicField DataField="A" />
        <asp:TemplateField>
            <EditItemTemplate>
                <asp:TextBox ID="B" runat="server" TextMode="MultiLine" Columns="80" Rows="8" Text="<%# BindItem.B %>" />
            </EditItemTemplate>
            <ItemTemplate>
                <pre><asp:Label runat="server" Text="<%# Item.B %>"  /></pre>
            </ItemTemplate>
        </asp:TemplateField>
      </Fields>
</asp:DetailsView>

所有这些代码都在ASP.NET 4.5上的Visual Studio 2012中运行.

怎么了

到现在为止还挺好.更新和查看作品.当我输入无效值时,问题就开始了.对字段A使用“”会在页面顶部显示一条漂亮的错误消息.好极了!但是,当我使用“”作为字段B的值时会发生这种情况:

public void DetailsView_UpdateItem(int id)
    {
      var item = db.MyTable.Where(row => row.Id==id).Single();
      TryUpdateModel(item);
      if (ModelState.IsValid)
        db.SubmitChanges();
    }

>调用UpdateItem方法
> TryUpdateModel可以将表单值填充到项目中.
>调试时,我可以看到item.B为null,正如预期的那样
>然后ModelState.IsValid返回true?!?
>对db.SubmitChanges()的调用因异常而失败

问题

我不明白为什么当数据模型指定B不能为null时,ModelState.IsValid将返回true.有人可以解释一下吗?我究竟做错了什么?

解决方法

我尝试过的一件事是通过包含以下代码将Data Annotations添加到数据类.它没用.

[MetadataType(typeof(MyTableMetadata))]
  public partial class MyTable
  {
  }

  public class MyTableMetadata
  {
    [Required]
    [StringLength(255,MinimumLength=1)]
    public string B { get; set; }
  }

很明显,我可以在UpdateItem方法中手动检查null,或者我可以添加RequiredFieldValidator – 但我不想这样做.

解决方法

只是一些武断的建议: 确保您正在引用System.ComponentModel.DataAnnotations 3.5. (不是3.6)或其他一些正确的命名空间(据我所知,只有一些用于WCF RIA服务). 尝试不同的设置 [DisplayFormat(ConvertEmptyStringToNull = …)] 确保您正在执行POST请求=)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读