MVC 3, (бритва) частичная загрузка с проверкой - PullRequest
9 голосов
/ 25 июля 2011

Привет, я создаю прототип Ajax-мастера с помощью MVC 3 (бритва). Я заметил странность, когда вы возвращаете частичное представление в UpdateTargetId, включающее представление, но не добавляющее / не применяющее ненавязчивый JavaScript. Если я загружаю частичное представление вне блока ajax, например,

@Html.Partial("Company")

Работает отлично, поэтому я не пропускаю ни одной из стандартных библиотек и Мой веб-конфиг все хорошо.

Так что на данный момент я немного озадачен.

Мой взгляд следующий:

@using(Ajax.BeginForm("Step", "Origination", new AjaxOptions { UpdateTargetId = "stepArea" })){

    <div id="stepArea"></div>
   <input id="btnSubmit" type="submit" value="submit" />
}

Контроллер:

public ActionResult Step(FormCollection formCollection)
{
    if (this.Request.IsAjaxRequest())
    {
        switch ((TempData["step"] as string))
        {
            case "Company":
                TempData["step"] = "Person";
                return PartialView("Company");

            case "Person":
                TempData["step"] = "Pay";
                return PartialView("Person");

            case "Settlement":
                return PartialView("Pay");

            default:
                TempData["step"] = "Company";
                return PartialView("UserType");
        }
    }
    return View();
}

Мой вопрос: может ли проверка с частичным представлением быть инициализирована / реализована с помощью частичного обновления?

Ответы [ 3 ]

10 голосов
/ 26 июля 2011

После прочтения нескольких форумов и проведения экспериментов.последний кусок головоломки, заставляющий валидацию работать после возвращения частичного представления. jquery.validate.unobtrusive не работает с динамически внедренными элементами

<script type="text/javascript">

    function validateAjaxForm() {
        $("form").removeData("validator");
        $("form").removeData("unobtrusiveValidation");
        $.validator.unobtrusive.parse("form");
        return $('#form').valid();
    }
</script>


 @{ Html.EnableClientValidation(true); } 
@using (Ajax.BeginForm("Step", "Origination", new AjaxOptions { UpdateTargetId = "stepArea", OnBegin = "return validateAjaxForm();" }, new { id = "form" }))
{
    <div id="stepArea"></div>
    <input id="btnSubmit" type="submit" value="submit" />
}

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

9 голосов
/ 25 июля 2011

Попробуйте инициализировать FormContext, если по вашему мнению он равен нулю.Это должно добавить ненавязчивые атрибуты проверки «data-val- *» к сгенерированным элементам управления

@{
    if (Html.ViewContext.FormContext == null)
    {
        Html.ViewContext.FormContext = new FormContext();
    }
}
0 голосов
/ 12 апреля 2013

Существует большая проблема с решением Nickz, из-за которой я вырывал свои волосы, пока не нашел другой обходной путь.

    // forces creation of a new validator, which in turn causes 
    // an extra submit event handler to be attached!!!
    $("form").removeData("validator");
    $("form").removeData("unobtrusiveValidation");
    $.validator.unobtrusive.parse("form"); 

Когда вы делаете это, каждый раз, когда вы вызываете $.validator.unobtrusive.parse(), новый обработчик события будет присоединен к событию отправки формы, оставляя старый обработчик события без изменений. Это означает, что когда вы запускаете приведенный выше код несколько раз, валидатор будет без необходимости запускаться несколько раз при запуске события submit. Это вызвало серьезные проблемы с производительностью для меня. В итоге я написал собственную альтернативу методу parse(), который назвал updateParse:

    $.extend($.validator.unobtrusive, {
    updateParse: function (selector) {
        /// <summary>
        /// Custom alternative for the built in method $.validator.unobtrusive.parse() which can updates an existing validator.
        /// Use this only when a validator has not yet been initialized, i.e. when $.validator.unobtrusive.parse()
        /// has not yet been called before.
        /// This is intended for use after you dynamically add / remove / modify validatable elements to a form via AJAX.
        /// Parses all the HTML elements in the specified selector. It looks for input elements decorated
        /// with the [data-val=true] attribute value and enables validation according to the data-val-*
        /// attribute values.
        /// </summary>
        /// <param name="selector" type="String">Any valid jQuery selector.</param>
        var $forms = $(selector)
            .parents("form")
            .andSelf()
            .add($(selector).find("form"))
            .filter("form");

        $(selector).find(":input[data-val=true]").each(function () {
            $.validator.unobtrusive.parseElement(this, true);
        });

        $forms.each(function () {
            var form = $(this);
            var info = form.data("unobtrusiveValidation");
            if (info) {
                var validator = form.data("validator");
                if (validator) {
                    validator.settings.rules = info.options.rules;
                }
                else {
                    throw "validator not yet initialized for this form yet -- use $.validator.unobtrusive.parse() instead";
                }
            }
        });
    }

Это обновит правила валидации существующего объекта валидатора, вместо того, чтобы форсировать создание нового валидатора при добавлении дополнительного обработчика события submit. В моем варианте метод parse() должен работать только тогда, когда валидатор уже существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...