【问题标题】:Remote validation in MVC3.0MVC3.0 中的远程验证
【发布时间】:2011-12-26 10:45:09
【问题描述】:

我对某个类的某个字段进行了远程验证:

    [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”将正确触发,但编辑和创建中的验证方法不同。当我处于创建模式或编辑模式时,如何触发正确的方法?我想如果我可以将动作名称传递给这个方法,那么我可以管理它。但我不知道如何将动作名称传递给远程方法。否则,你能建议我一个正确的方法吗?

【问题讨论】:

  • 这是一个非常愚蠢的方法,因为一个方法,单独的控制器类!!!没有任何方法吗?
  • 将解决方案称为“非常愚蠢”通常不是获得帮助的最佳方式。
  • Tnx 为您的解决方案,但似乎这是唯一的方法。

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


【解决方案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=&gt;m.IsEditing),然后您的验证处理程序应该变成:

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

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

【讨论】:

  • @Shayan 它是 - 如果你想忽略“为什么”你有两个视图模型,这里基本上每个人都推荐。
【解决方案2】:

使用两个视图模型,每个模型都有不同的属性名称及其适用的远程验证方法。这是为每个视图简单地使用视图模型的众多原因之一。所以你应该有一个用于创建和编辑的视图模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多