เหตุใดข้อผิดพลาด ModelState จึงถูกเพิ่มเข้ามาอีกครั้งในไซต์ ASP.NET MVC ของฉัน

ฉันมีโมเดลที่ค่อนข้างซับซ้อนซึ่งฉันใช้เพื่อแสดงแบบฟอร์มและดำเนินการตรวจสอบความถูกต้องโดยใช้ข้อมูลเมตาข้อมูลเมตาของโมเดล

View Model มีรายการวัตถุลูกที่รวมอยู่ในแบบฟอร์ม วัตถุลูกจะขึ้นอยู่กับสิ่งนี้:

[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


person quakkels    schedule 16.11.2010    source แหล่งที่มา


คำตอบ (1)


พวกเขาจะถูกเพิ่มหนึ่งครั้งโดยตัวประสานโมเดลเริ่มต้นเมื่อพยายามแยกอาร์กิวเมนต์การกระทำ 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 });
}
person Darin Dimitrov    schedule 16.11.2010
comment
ขอบคุณสำหรับคำตอบโดยละเอียด ฉันจะเล่นกับเรื่องนี้ - person quakkels; 16.11.2010
comment
ใช่! ขอบคุณสำหรับวิธีแก้ปัญหานี้! - person quakkels; 16.11.2010