MVC3.0中的远程验证

时间:2011-12-26 10:45:10

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

我在一个类的某个字段上进行了远程验证:

    [Remote("IsCityUnique", "City", AdditionalFields = "Onvan", HttpMethod = "POST", ErrorMessage = "City name isn't unique.")]
    public string CityName
    {
        get { return _CityName; }
        set
        {
            if (_CityName != value)
            {
                _CityName = value;
                OnPropertyChanged("CityName");
            }
        }
    }
    private string _CityName;

在我的控制器中:

    public JsonResult IsCityUnique(string Cityname)
    {
        ....
        List<City> citylist = cr.GetAll().ToList();
        return Json(!citylist .Any(c => c.CityName== Cityname));
    }

“IsCityUnique”将正确触发,但编辑&amp;创建是不同的。当我处于创建模式或编辑模式时,如何激活正确的方法?我想如果我可以将动作名称传递给这个方法,那么我可以管理它。但我不知道如何将动作名称传递给远程方法。否则,你能建议我一个正确的方法吗?

2 个答案:

答案 0 :(得分:1)

使用两个视图模型,每个模型都有一个不同的属性名称及其适用的远程验证方法。这是为每个视图简单地使用视图模型的众多原因中的另一个。因此,您应该拥有“创建”和“编辑”的视图模型。

答案 1 :(得分:1)

因此,虽然我仍然建议使用单独的ViewModel进行编辑和创建,这比仅使用远程验证具有更多架构优势,但能够使用AdditionalFields执行您想要的操作属性,您似乎在属性中使用但不在验证处理程序中使用。

我无法对此进行测试,但如果真的希望以这种方式进行测试,那么您可以执行以下操作:

到ViewModel添加:

public bool IsEditing { get; set; }

当您进行编辑操作时,请将此设置为true(并在创建操作时设置为false)。

[Remote("IsCityUnique", "City", AdditionalFields = "IsEditing", HttpMethod = "POST", ErrorMessage = "City name isn't unique.")]
public string CityName { get; set; }

在您看来,您可能需要呈现@Html.HiddenFor(m=>m.IsEditing),然后您的验证处理程序应该变为:

public JsonResult IsCityUnique(string Cityname, bool IsEditing)
{
    if(editing) { /* Do editing Logic */ }
    else { /* Do other logic. */ }
}

这样的东西应该工作,但我现在无法测试它。但你真的可能更好地观察关注点的分离,并弄清楚如何在编辑和创建域对象之间划分责任。