【问题标题】:auto binding not converting empty string to 0 for int model property自动绑定不将空字符串转换为 0 用于 int 模型属性
【发布时间】:2009-12-19 01:01:40
【问题描述】:

我的模型对象有一个名为 SpecialProjectId 的 int 属性。该属性对应于一个选择框。我在选择框中使用默认选项。但是,当我使用默认值提交表单时,ModelState.isValid 一直为 false,因为默认选择选项具有 value="" 并且由于某种原因,默认绑定器在找到 "" 作为表单的值时未将 0 绑定到 SpecialProjectId字段 SpecialProjectId。下面是我能想到的所有代码。请帮忙。注意:我使用 asp.net mvc 2.0.0 和 System.ComponentModel.DataAnnotations 进行验证。

//我是如何创建选择框的

<%= Html.DropDownList("SpecialProjectId", "* Select One *") %>

//助手创建了什么

<select id="SpecialProjectId" name="SpecialProjectId">
<option value="">* Select One *</option>
<option value="1">sp</option>
<option value="3">extra special project</option>
</select>

//我的动作方法

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add([Bind(Exclude="Id, DateAudited")]AuditModel auditModel) {
      try {
          if (!ModelState.IsValid) {                    
                    return View("AuditForm", auditModel);
           }
           //...add audit code...

//我的模型对象

using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using Iesi.Collections;

public class AuditModel
{
    public virtual int Id {get; set;}
    //NOT REQUIRED!!!//
    public virtual int SpecialProjectId {get; set;}
    [Required]
    public virtual int AccountId {get; set;}
    [Required]
    public virtual DateTime DateReceived {get; set;} 
}  

【问题讨论】:

  • 我对此的最终解决方案是使用 Nullable 版本,例如 int?、DateTime?、float?对于我所有的模型字段。一旦我切换到那个,我就不再收到“需要一个值的消息”。我还没有检查代码以确定,但我几乎可以肯定,当自动绑定代码运行时,它会在尝试将“”或 null 绑定到 int 或 float 时引发异常。让模型字段可以为空可以避免异常和 vauge 错误消息。现在,当表单中不存在 [Required] 字段时,我只会看到正常的“Field Blah is required”。

标签: asp.net-mvc binding


【解决方案1】:

这不是为什么 "" 没有被变成 0 的答案,而是首先避免这个问题的一种方法。

//手动将值为0的“Select One”添加到SelectList中

List<SpecialProject> specialProjectsForSelectBox = new List<SpecialProject>();
specialProjectsForSelectBox.Add(new SpecialProject(0, "* Select One *"));
specialProjectsForSelectBox.AddRange(specialProjectBusinessLogic.FindAllActive());

【讨论】:

【解决方案2】:

为什么不给空选项一个明确的值“0”?

编辑:我的错,我错过了你用助手创建它

【讨论】:

  • 我通过手动将对象添加到用于构建 SelectList 的列表中,最终将 0 添加到“选择一个”选项。详情见我的回答。
【解决方案3】:

"当它发现 "" 作为表单字段的值时,不将 0 绑定到 SpecialProjectId"

我认为这是预期的行为。

您隐式告诉模型绑定器将此 SpecialProjectId 绑定到一个 int。不能,因此您的模型状态无效。

您想将您的 int 设置为可为空的 int?那么你的模型就是有效的。

将其视为“无法绑定”无效而不是“验证失败”无效。

【讨论】:

  • 我猜这是预期的行为。我可以发誓默认的自动活页夹知道为你把“”变成0。如果我足够关心,我会设置一个简单的 asp.net mvc 应用程序而不使用 DataAnotatons 并进一步测试它。
  • 将我的模型字段切换为 int?和其他 Nullable 类型帮助我获得了正确的行为。唯一不好的是我必须做很多 blah.HasValue 和 blah.Value,但至少我不再看到“需要值”的消息了。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 2014-10-13
相关资源
最近更新 更多