代码之家  ›  专栏  ›  技术社区  ›  quakkels

为什么在我的ASP.NET MVC站点中再添加一次ModelState错误?

  •  0
  • quakkels  · 技术社区  · 14 年前

    我有一个相当复杂的模型,我使用它来呈现表单并使用模型的元信息元信息执行验证。

    视图模型具有表单中包含的子对象列表。子对象基于以下内容:

    [Table]
    public class FieldInstance
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
        public long fiID { get; set; }
        [Column]
        public string fiLabel { get; set; }
        [Column]
        public bool fiIsRequired { get; set; }
    
        [DisplayName("alpha-numeric value")]
        [Column]
        public string fiStrValue { get; set; }
    
        [DisplayName("date/time value")]
        [Column]
        public DateTime? fiDateTimeValue { get; set; }
    
        [DisplayName("integer value")]
        [Column]
        public long? fiIntValue { get; set; }
    
        [DisplayName("decimal value")]
        [Column]
        public decimal? fiDecValue { get; set; }
        [Column]
        public int fiOrder { get; set; }
        [Column]
        public long fiStreamEntryID { get; set; }  // FK
        [Column]
        public long fiFieldTypeID { get; set; }    // FK
    
        // Relationship (many FieldInstances to one StreamEntry)
        // using EntityRef<StreamEntry> and ThisKey
        // which is "This" table's FK
        private EntityRef<StreamEntry> _StreamEntry;
        [System.Data.Linq.Mapping.Association(Storage = "_StreamEntry", ThisKey = "fiStreamEntryID")]
        public StreamEntry StreamEntry
        {
            get { return this._StreamEntry.Entity; }
            set { this._StreamEntry.Entity = value; }
        }
    
        // Relationship (one FieldInstance to one FieldType)
        // using EntityRef<FieldTypes> and ThisKey
        private EntityRef<FieldTypes> _FieldType;
        [System.Data.Linq.Mapping.Association(Storage = "_FieldType", ThisKey = "fiFieldTypeID")]
        public FieldTypes FieldTypes
        {
            get { return this._FieldType.Entity; }
            set { this._FieldType.Entity = value; }
        }
    

    我用的是 Html.EditorFor() 语句为列表中的每个项呈现局部视图模板。

    如果我把文字输入 Datetime 那么,菲尔德 Html.ValidationSummary() 显示:

    •The value 'asd' is not valid for date/time value.
    •The value 'asd' is not valid for date/time value.
    

    我的问题是错误被添加到 ModelState 两次而不是一次。这是控制器操作:

        [HttpPost]
        public ActionResult EntryEdit(StreamEntry form)
        {
            // Get values
            StreamEntry entry = 
                form.seID == 0
                ? new StreamEntry()
                : genesisRepository.GetEntryByID(form.seID);
    
            // Get Stream for new entry
            if (form.seID == 0)
                entry.Stream = genesisRepository.GetStreamByID(form.StreamID);
    
            //Validate
            TryUpdateModel(entry);
    
            if (ModelState.IsValid)
                return RedirectToAction("EntryList", new { id = entry.StreamID });
            else
                return View(entry);
        }
    

    为什么错误是由于存在不正确的输入而触发的,从而导致错误的两个实例被添加到“ModelState”中?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Darin Dimitrov    14 年前

    当默认模型绑定器试图解析 StreamEntry form 动作参数和第二次调用 TryUpdateModel 同一类型的方法( StreamEntry ). 所以要么使用动作参数要么 TryUpdateModel公司 方法,但决不能两者兼得。就我个人而言,我总是使用动作参数,从不使用 TryUpdateModel公司 方法。

    所以要纠正你的错误:

    [HttpPost]
    public ActionResult EntryEdit(StreamEntry model)
    {
        if (!ModelState.IsValid)
        {
            // the model was not valid => redisplay the form so that 
            // the user can fix errors
            return View(model);
        }
        // Remark: might need to load the model's corresponding stream
        // from the repository if its values weren't posted
    
        // the model was valid => update it in the database
        genesisRepository.Update(model);
        return RedirectToAction("EntryList", new { id = model.StreamID });
    }