编辑时验证对象是否存在

时间:2011-06-29 21:33:37

标签: c# asp.net asp.net-mvc asp.net-mvc-3

这是非常愚蠢的,但我不能为我的生活弄明白。

我想在添加或编辑Employee时验证Employee用户名是否已存在。这是我的观点模型:

public class EmployeeViewModel
{
    [ScaffoldColumn(false)]
    public int EmployeeId { get; set; }

    [Remote("UsernameExists", "Employees", ErrorMessage = "Username already exists")]
    public string Username { get; set; }
}

在我的控制器中:

public ActionResult UsernameExists(string username)
{
    return Json(!_employeesRepository.UsernameExists(username), JsonRequestBehavior.AllowGet);
}

员工存储库中的功能:

public bool UsernameExists(string username)
{
    return Employees.Where(e => e.Username.ToLower().Equals(username.ToLower())).Count() > 0;
}

当我创建员工时,这非常有用。但是,如果我编辑一个并且我尝试保存它,我会收到用户名已经存在的错误(这是真的)。所以我需要以某种方式告诉函数,如果我正在使用该用户名编辑一个Employee,那么用户名就可以了。

这可以通过远程验证吗?

2 个答案:

答案 0 :(得分:1)

传递额外的标记以指示您所处的模式,例如: bool isEditMode并在此基础上调整结果。您可以使用AdditionalFields属性传递该信息;另外,请看一下:Remote Validation in ASP.Net MVC 3: How to use AdditionalFields in Action Method

答案 1 :(得分:0)

您可以通过使用两个不同的视图模型来解决此问题,在这两个视图模型中,您可以从另一个视图模型中派生出一个:超类可用于编辑,子类用于具有远程验证的插入。

public class EmployeeViewModel // The normal one, can be used for editing
{
    [ScaffoldColumn(false)]
    public int EmployeeId { get; set; }

    public virtual string Username { get; set; }
}

public class InsertEmloyeeViewModel : EmployeeViewModel
{
    [Remote("UsernameExists", "Employees", ErrorMessage = "Username already exists")]
    public override string Username { get; set; }

}

当edit-functionlity还包含一些“特色”时,您可以从基类EmployeeViewmodel派生第三个类“EditEmployeeViewModel”。