Лучший подход для расширения ненавязчивого JavaScript в MVC3, чтобы добавить стиль на стороне клиента div - PullRequest
29 голосов
/ 27 августа 2011

Я использую html5 / Razor / MVC3, используя шаблон Bootstrap из Twitter. Я хочу, чтобы проверка формы выглядела так, как они документированы (http://twitter.github.com/bootstrap/#forms).). Поэтому, если мы посмотрим, как стандартная стандартная таблица MVC3 для регистрации учетной записи, разметка будет выглядеть следующим образом:

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class="form-stacked" })) {
    @Html.ValidationSummary(true, "Snap! Something went wrong")
    <div>
        <fieldset>
            <legend>Account Information</legend>
            <div class="clearfix error">
                @Html.LabelFor(m => m.UserName)
                <div class="input">
                    @Html.TextBoxFor(m => m.UserName)
                    <span class="help-inline">@Html.ValidationMessageFor(m => m.UserName)</span>
                </div>
            </div>

            <div class="clearfix">
                @Html.LabelFor(m => m.Email)
                <div class="input">
                    @Html.TextBoxFor(m => m.Email)
                    <span class="help-inline">@Html.ValidationMessageFor(m => m.Email)</span>
                </div>
            </div>

            <div class="clearfix">
                @Html.LabelFor(m => m.Password)
                <div class="input">
                    @Html.PasswordFor(m => m.Password)
                    <span class="help-inline">@Html.ValidationMessageFor(m => m.Password)</span>
                </div>
            </div>

            <div class="clearfix">
                @Html.LabelFor(m => m.ConfirmPassword)
                <div class="input">
                    @Html.PasswordFor(m => m.ConfirmPassword)
                    <span class="help-inline">@Html.ValidationMessageFor(m => m.ConfirmPassword)</span>
                </div>
            </div>
        </fieldset>
        <div class="actions">
            <button class="btn large primary" type="submit">Register</button>
        </div>
    </div>

Что я хочу сделать, так это чтобы контейнер div вставлял класс «error», как я жестко запрограммировал в первом входе. (Таким образом, при входе на страницу у div будет класс «clearfix», но если этот входной блок не пройдет проверку, он будет помечен как «clearfix error»). Я полагаю, что мне придется обновить блок div, добавив в него некоторый идентификатор и, возможно, добавить новый атрибут data в ValidationMessage. У меня нет проблем с расширением помощника ValidationMessageFor. Я просто не уверен на 100%, каким должен быть подход для расширения имеющейся библиотеки. Любые предложения о том, как подойти к этому?

ТИА.

UPDATE :

Я думаю, что такой подход разумен:

<div id="UserNameContainer" class="clearfix error">
    @Html.LabelFor(m => m.UserName)
    <div class="input">
        @Html.TextBoxFor(m => m.UserName)
        <span class="help-inline">@Html.ValidationMessageFor(m => m.UserName, null, new { @data_container = "UserNameContainer" })</span>
    </div>
</div>

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

Ответы [ 7 ]

52 голосов
/ 10 октября 2011

Метод $.validator.setDefaults решил эту проблему для меня с помощью Bootstrap из Twitter. Я использую jquery.validate.js и jquery.validate.unobtrusive.js.

Поскольку ненавязчивая проверка в DOM ready сканирует ваш документ и кэширует ненавязчивые параметры проверки для каждой формы, с которой он сталкивается, необходимо вызвать метод $.validator.setDefaults до сканирования документа.

// setup defaults for $.validator outside domReady handler
$.validator.setDefaults({
    highlight: function (element) {
        $(element).closest(".clearfix").addClass("error");
    },
    unhighlight: function (element) {
        $(element).closest(".clearfix").removeClass("error");
    }
});

$(document).ready(function() {
       // do other stuff
});
4 голосов
/ 01 сентября 2011

натолкнулся на ту же проблему. Я занимаюсь этим путем добавления и расширения класса HtmlHelper.

Это то, что я сделал для ValidationSummary:

   public static class TwitterBootstrapHelperExtensions
    {
        public static MvcHtmlString BootstrapValidationSummary(this HtmlHelper helper,
                               bool excludePropertyErrors,
                               string message)
        {
            if(helper.ViewData.ModelState.Values.All(v => v.Errors.Count == 0)) return new MvcHtmlString(string.Empty);

            string errorsList = "<ul>";
            foreach (var error in helper.ViewData.ModelState.Values.Where(v => v.Errors.Count >0))
            {
                errorsList += string.Format("<li>{0}</li>", error.Errors.First().ErrorMessage);
            }
            errorsList += "</ul>";
            return new MvcHtmlString(string.Format("<div class=\"alert-message error\"><span>{0}</span>{1}</div>",message,errorsList));

        }
    }

И в файле .cshtml я заменяю Html.ValidationSummary следующим:

@Html.BootstrapValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")

Не забудьте добавить пространство имен вашего класса расширений в файл web.config папки views.

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

1 голос
/ 14 декабря 2012

Вы можете интегрировать проверку MVC3 с платформой Bootstrap, добавив следующий javascript на свою страницу (Просмотр)

<script>
$(document).ready(function () {
/* Bootstrap Fix */
$.validator.setDefaults({
    highlight: function (element) {
        $(element).closest("div.control-group").addClass("error");
    },
    unhighlight: function (element) {
        $(element).closest("div.control-group").removeClass("error");
    }
});
var current_div;
$(".editor-label, .editor-field").each(function () {
    var $this = $(this);
    if ($this.hasClass("editor-label")) {
        current_div = $('<div class="control-group"></div>').insertBefore(this);
    }
    current_div.append(this);
});
$(".editor-label").each(function () {
    $(this).contents().unwrap();
});
$(".editor-field").each(function () {
    $(this).addClass("controls");
    $(this).removeClass("editor-field");
});
$("label").each(function () {
    $(this).addClass("control-label");
});
$("span.field-validation-valid, span.field-validation-error").each(function () {
    $(this).addClass("help-inline");
});
$("form").each(function () {
    $(this).addClass("form-horizontal");
    $(this).find("div.control-group").each(function () {
        if ($(this).find("span.field-validation-error").length > 0) {
            $(this).addClass("error");
        }
    });
});
});
</script>

Кроме того, в представлениях (например, «Create.cshtml») убедитесь, что поля в форме отформатированы следующим образом ...

    <div class="editor-label">
        @Html.LabelFor(Function(model) model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(Function(model) model.Name)
        @Html.ValidationMessageFor(Function(model) model.Name)
    </div>

С этим решением, скорее всего, будет достаточно просто добавить JavaScript без редактирования просмотра.

1 голос
/ 04 января 2012

Я предпочитаю менять CSS начальной загрузки.Просто добавили классы проверки jQuery в нужном месте.Ошибка проверки поля и Ошибка подтверждения ввода

    form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline, .field-validation-error {
  color: #b94a48;
}
form .clearfix.error input, form .clearfix.error textarea, .input-validation-error {
  color: #b94a48;
  border-color: #ee5f5b;
}
form .clearfix.error input:focus, form .clearfix.error textarea:focus, .input-validation-error:focus {
  border-color: #e9322d;
  -webkit-box-shadow: 0 0 6px #f8b9b7;
  -moz-box-shadow: 0 0 6px #f8b9b7;
  box-shadow: 0 0 6px #f8b9b7;
}
1 голос
/ 28 августа 2011

Вместо того, чтобы заново изобретать это конкретное колесо, проверьте плагин validationEngine, доступный по адресу http://www.position -absolute.com / articles / jquery-form-validator-потому-form-validation-is-a-mess / .

Вы можете настроить элементы всплывающего окна так, как вам удобно, и подключиться к jQuery.validate.js тривиально.

0 голосов
/ 07 ноября 2013

Мне нужно было решить эту проблему с помощью Bootstrap 3.1 и Razor. Вот что я использовал:

$.validator.setDefaults({
    highlight: function (element) {
        $(element).parents(".form-group").addClass("has-error");
    },
    unhighlight: function (element) {
        $(element).parents(".form-group").removeClass("has-error");
    }
});

$(function () {

    $('span.field-validation-valid, span.field-validation-error').each(function () {
        $(this).addClass('help-block');
    });

    $('form').submit(function () {
        if ($(this).valid()) {
            $(this).find('div.form-group').each(function () {
                if ($(this).find('span.field-validation-error').length == 0) {
                    $(this).removeClass('has-error');
                }
            });
        }
        else {
            $(this).find('div.form-group').each(function () {
                if ($(this).find('span.field-validation-error').length > 0) {
                    $(this).addClass('has-error');
                }
            });
        }
    });

    $('form').each(function () {
        $(this).find('div.form-group').each(function () {
            if ($(this).find('span.field-validation-error').length > 0) {
                $(this).addClass('has-error');
            }
        });
    });
});

Это комбинация ответа и помощи @ German из этой публикации от theBraindonor. Обновлен для использования новых классов Bootstrap 3.

0 голосов
/ 17 ноября 2011

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

Вы можете найти его в пакете nuget по адресу: http://nuget.org/List/Packages/MahApps.Twitter.Bootstrap

Также имеется несколько шаблонов скаффолдинга для автоматического создания новых представлений.

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