Удаленная проверка ASP.NET MVC 3

У меня есть контроллер проверки в пути моего проекта, который я пытаюсь использовать из области, используя следующий атрибут свойства модели...

    [Remote("IsValidUserName", "Validation", "", ErrorMessage = "Invalid username")]

Но когда это визуализируется, проверка выполняется против действия "IsValidUserName" контроллера "Проверка" в той же области, что и страница, а не внутри корневой области...

Данные-валин-дистанционного URL = "/Участники/Validation/IsValidUserName"

Любая помощь будет оценена.

Спасибо.

Ответы

Ответ 1

К сожалению, как этот атрибут реализован. Здесь выдержка из конструктора этого атрибута:

public RemoteAttribute(string action, string controller, string areaName) : this()
{
    if (string.IsNullOrWhiteSpace(action))
    {
        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "action");
    }
    if (string.IsNullOrWhiteSpace(controller))
    {
        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "controller");
    }
    this.RouteData["controller"] = controller;
    this.RouteData["action"] = action;
    if (!string.IsNullOrWhiteSpace(areaName))
    {
        this.RouteData["area"] = areaName;
    }
}

Обратите внимание на тест IsNullOrWhiteSpace против areaName в конце, который убивает все?

Вы можете исправить это, написав настраиваемый удаленный атрибут:

public class MyRemoteAttribute : RemoteAttribute
{
    public MyRemoteAttribute(string action, string controller, string area)
        : base(action, controller, area)
    {
        this.RouteData["area"] = area;
    }
}

а затем:

[MyRemote("IsValidUserName", "Validation", "", ErrorMessage = "Invalid username")]
public string Username { get; set; }

Теперь будет создан правильный data-val-remote-url="/Validation/IsValidUserName".

Ответ 2

Я столкнулся с этой проблемой и нашел решение, которое работает для меня. Удаленный атрибут принимает значение AreaReference Enum.

System.Web.Mvc.AreaReference - это ENUM, который имеет два значения UseRoot и UseCurrent, более подробно найденные здесь

Пример использования, который работает для меня:

[Remote("IsValidUserName", "Validation", System.Web.Mvc.AreaReference.UseRoot, ErrorMessage = "Invalid username")]