Проверка ASP.COM MVC завершается неудачно при смешивании проверки аннотаций данных с проверкой jquery - PullRequest
1 голос
/ 26 мая 2011

У меня есть чрезвычайно простой пример, пытающийся использовать аннотации данных с ненавязчивым JavaScript в MVC3:

Модель:

public class RegisterModel {
    [Required]
    public string EmailAddress { get; set; }

    [Required]
    public string FirstName { get; set; }
}

Контроллер:

public class HomeController : Controller {
    public ActionResult Index() {
        return View(new RegisterModel());
    }

    [HttpPost]
    public ActionResult Index(RegisterModel model) {
        return View(model);
    }
}

Вид:

@model RegisterModel

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using( Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "mainForm" } ) ) {
    @Html.EditorFor( m => m.FirstName)<br/>
    @Html.ValidationMessageFor( m => m.FirstName)<br/>

    @Html.EditorFor(m => m.EmailAddress)<br/>
    @Html.ValidationMessageFor(m => m.EmailAddress)<br/>

    <input type="submit" value="Submit" />
}

Все отлично работает. Когда я нажимаю кнопку «Отправить», когда форма пуста, она не позволяет мне отправить заявку. Он выводит ненавязчивый JavaScript и выполняет проверку клиента. Я хотел сделать некоторую удаленную проверку, чтобы убедиться, что адрес электронной почты не используется, поэтому я добавил следующее к представлению:

<script type="text/javascript">
    $("#mainForm").validate({
        rules: {
            EmailAddress: {
                email: true,
                remote: {
                    url: "@Url.Action("CheckForValidEmail")",
                    type: "post"
                }
            }
        },
        messages: {                
            EmailAddress: { 
                email: "You must provide a valid e-mail address.",
                remote: jQuery.format("The email {0} is already in use.")
            }
        }
    });
</script>

Как только я добавлю это, моя проверка перестает работать. Я думаю, это потому, что я смешиваю проверку аннотаций данных с проверкой jquery.

Если я удаляю атрибуты [Required] из модели и добавляю это в свой скрипт, тогда все работает:

FirstName: { required: true },
EmailAddress: { required: true, email: true, remote ... }

Все отлично работает.

Должен ли я отказаться от ненавязчивой проверки JavaScript, чтобы использовать эту удаленную проверку? Есть ли способ сделать удаленную проверку с помощью ненавязчивого JavaScript?

1 Ответ

2 голосов
/ 26 мая 2011

Да, проблема связана с тем, что вы присоединяете другой обработчик проверки к форме, которая конфликтует с той, что прикреплена к ненавязчивой проверке jquery.

Для этого вы можете использовать атрибут Remote :

public class RegisterModel {
    [Required]
    [Remote("CheckForValidEmail", "Home")]
    public string EmailAddress { get; set; }

    [Required]
    public string FirstName { get; set; }
}

и действие CheckForValidEmail для HomeController:

public ActionResult CheckForValidEmail(string emailAddress)
{
    if (repository.IsValid(emailAddress))
    {
        // If you return a JSON string the model will be considered
        // invalid and this string will be used as error message
        return Json(
            string.Format(
                "The email {0} is already in use.", 
                emailAddress
            ), 
            JsonRequestBehavior.AllowGet
        );
    }
    // Return true to indicate that the email address is valid
    return Json(true, JsonRequestBehavior.AllowGet);
}

Теперь вам больше не нужно писать какой-либо javascript.

...