0

我需要在控制器内的创建和编辑方法中保存到数据库之前检查重复项。然后我需要显示重复的错误消息而不是通用错误消息。

我对重复的定义是:userid + Code1ID + Code2ID + Code3ID + Code4ID。

问题:当上述值的组合已经存在时,如何检查重复项?

表名

 Character:
CharacterID int 
UserID int
Code1ID int
Code2ID int
Code3ID int
Code4ID int
Name Varchar(40)

我的主键由 UserID + Code1ID + Code2ID + Code3ID + Code4ID 组成。这保证没有重复输入到数据库中。但我返回的错误消息是一般错误消息。

我需要先检查重复项,然后仅根据重复项返回警告消息或错误消息。

这是控制器内部的编辑方法

  //
        // GET: /Character/Edit/5

        public ActionResult Edit(int id)
        {
            Character character = db.Characters.Find(id);
        PopulateUserIDDropDownList(character.UserID);
            PopulateCode1IDDropDownList(character.Code1ID);
            PopulateCode2IDDropDownList(character.Code2ID);
            PopulateCode3IDDropDownList(character.Code3ID);
            PopulateCode4IDDropDownList(character.Code4ID);
            return View(character);
        }

        //
        // POST: /Character/Edit/5

        [HttpPost]
        public ActionResult Edit(Character character)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    db.Entry(character).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch
            {
                ModelState.AddModelError("", "Generic Error. Unable to save changes. Try again, and if the problem persists, see your system administrator.");
            }
        PopulateUserIDDropDownList(character.UserID);
            PopulateCode1IDDropDownList(character.Code1ID);
            PopulateCode2IDDropDownList(character.Code2ID);
            PopulateCode3IDDropDownList(character.Code3ID);
            PopulateCode4IDDropDownList(character.Code4ID);
            return View(character);
        }

这是控制器内部的创建方法

    //
    // GET: /Character/Create

    public ActionResult Create()
    {
    PopulateUserIDDropDownList();
        PopulateCode1IDDropDownList();
        PopulateCode2IDDropDownList();
        PopulateCode3IDDropDownList();
        PopulateCode4IDDropDownList();
        return View();
    } 

    //
    // POST: /Character/Create

    [HttpPost]
    public ActionResult Create(Character character)
    {
        try
        {
            if (ModelState.IsValid)
            {
                db.Characters.Add(character);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch
        {
            ModelState.AddModelError("", "Generic Error.Unable to save changes. Try again, and if the problem persists, see your system administrator.");
        }
    PopulateUserIDDropDownList(character.UserID);
        PopulateCode1IDDropDownList(character.Code1ID);
        PopulateCode2IDDropDownList(character.Code2ID);
        PopulateCode3IDDropDownList(character.Code3ID);
        PopulateCode4IDDropDownList(character.Code4ID);
        return View(character);
    }

模型

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


namespace myproject.Models
{
    public class Character
    {
        [Key]
        public int CharacterID { get; set; }

        [Required(ErrorMessage = "User is required.")]
        [Display(Name = "User")]
        public Guid UserId { get; set; }

        [Required(ErrorMessage = "Code1 is required.")]
        [Display(Name = "Code1")]
        public int Code1ID { get; set; }


        [Required(ErrorMessage = "Code2 is required.")]
        [Display(Name = "Code2")]
        public int Code2ID { get; set; }

        [Required(ErrorMessage = "Code3 is required.")]
        [Display(Name = "Code3")]
        public int Code3ID { get; set; }

        [Required(ErrorMessage = "Code4 is required.")]
        [Display(Name = "Code4")]
        public int Code4ID { get; set; }

        [Required(ErrorMessage = "level is required.")]
        [Display(Name = "Level")]
        public int LevelID { get; set; }

        public virtual aspnet_Users Aspnet_User { get; set; }
        public virtual Code1 Code1 { get; set; }
        public virtual Code2 Code2 { get; set; }
        public virtual Code3 Code3 { get; set; }
        public virtual Code4 Code4 { get; set; }

    }
}
4

2 回答 2

5

您需要将remote属性添加到要检查重复的列中。你可能会在这里看到一个例子。您还可以根据此处描述的逻辑自定义错误消息。您可能需要在具有完整键的视图模型中添加另一个字段,然后在其上添加远程属性。如果您想要单个消息,那么您可能需要在此处描述自定义模型绑定器。或者如上所述添加另一个包含键连接值的字段并将远程属性添加到该字段并启用validationsummary

于 2012-07-05T20:11:11.580 回答
3

在保存到数据库之前...使用这些值搜索数据库...如果您找到某些内容...您有重复项,您可以显示正确的消息。

在编辑时,您需要为查询排除正在编辑的当前对象。

您可以使用这些 ID 作为 WHERE 部分在您的存储库上执行 Count() ...如果结果为 1 或更多...您有重复项。

于 2012-07-05T20:33:09.857 回答