Запретить отправку формы при использовании ненавязчивой проверки в ASP.NET MVC 3 - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь реализовать удаленную проверку с использованием ненавязчивого JavaScript ASP.NET MVC3.

Кажется, что это работает, но я могу отправить свою форму, даже если она не должна быть действительной.

Похоже, проверка не происходит достаточно быстро.Я использую сервер разработки ASP.NET с отладчиком VS 2010, и метод удаленной проверки не всегда срабатывает.Когда я немного подожду, проверка произойдет, и я не смогу отправить форму.

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

Есть ли способ исправить это?

РЕДАКТИРОВАТЬ:

Как вы и просили, вот частьмой код относительно проблемы.Я начну с вашего совета и использую проверку на стороне сервера, чтобы пользователи не могли обойти мои проверки.

Модель:

[Required(ErrorMessage = "*"), StringLength(50)]
[Remote("EventCategoryNameExists", "EventCategories",
    AdditionalFields = "EventCategoryId",
    ErrorMessageResourceType = typeof(Messages),
    ErrorMessageResourceName = "EventCategoryNameAlreadyExists")]
[LocalizedDisplayName("Name")]
public string Name { get; set; }

Просмотр:

<div id="formMain">

    @Html.HiddenFor(x => x.EventCategoryId)

    <fieldset class="formFieldset">
        <legend>@Labels.EventCategoryDetails</legend>
        <div class="formFieldsetContent">
            <table id="formTable" class="formTable">
                <tr>
                    <td class="formLabelCell" style="width: 90px;">
                        @Html.LabelFor(x => x.Name)&nbsp;:&nbsp;
                    </td>
                    <td class="formInputCell">
                        @Html.EditorFor(x => x.Name)
                        @Html.ValidationMessageFor(x => x.Name)
                    </td>
                </tr>
                <tr>
                    <td class="formLabelCell" style="vertical-align: top;">
                        @Html.LabelFor(x => x.Color)&nbsp;:&nbsp;
                    </td>
                    <td class="formInputCell">
                        @Html.EditorFor(x => x.Color)
                        @Html.ValidationMessageFor(x => x.Color)
                    </td>
                </tr>
            </table>
        </div>
    </fieldset>
</div>

<div class="formButtons">                      
    <input type="submit" id="btnSave" value="@Labels.Save" class="formButton" />
    <input type="button" id="btnCancel" value="@Labels.Cancel" class="formButton" />
</div>

Контроллер:

public ActionResult EventCategoryNameExists(int eventCategoryId, string name)
{
    return Json(!_eventService.EventCategoryNameExists(eventCategoryId, name), JsonRequestBehavior.AllowGet);
}

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Проверка на стороне клиента никогда не бывает достаточной. На Javascript нельзя рассчитывать, что он включен или исправлен, плюс его может обойти хитрый пользователь. Но возвращает ли ваша процедура проверки на стороне клиента логическое значение false? Если нет, то обычное действие отправки будет выполняться независимо.

0 голосов
/ 23 апреля 2011

Ваши аннотации данных также обрабатываются на стороне сервера - так что вы в порядке в этом отношении. Атрибут удаленной проверки отсутствует. Вам нужен пользовательский атрибут проверки или нужно также проверить эту же процедуру на стороне сервера. Извлеките свой проверочный вызов к общему методу, который вы проверяете в своем действии HttpPost (и, если он терпит неудачу, используйте ModelState.AddError), а также используйте ваш удаленный метод проверки, так что все будет хорошо. Удаленная проверка - все еще достойная функция на стороне клиента, поэтому я бы не стал отказываться от нее, если вы захотите эту функцию.

Что касается вашей конкретной проблемы с синхронизацией - я только что провел некоторое тестирование на своей странице удаленной проверки. Я установил Fiddler, чтобы иметь точки останова перед запросами. Я не могу отправить свою форму, пока не верну ответ с сервера. Попробуйте с помощью Fiddler и посмотрите, сможете ли вы воспроизвести его таким образом. Мне любопытно, если что-то еще на вашей странице помешает вашей удаленной проверке. У меня была проблема с более новой версией jQuery и удаленной проверкой. Когда я вернулся к базовому проекту MVC3 по умолчанию, он работал просто отлично - я не отлаживал его дальше, но это было из-за различий в версиях.

...