Editor для не рендеринга атрибутов проверки данных без BeginForm - PullRequest
15 голосов
/ 19 июня 2011

В приложении MVC я хочу динамически визуализировать некоторые части формы (которые похожи на PartialView на стороне контроллера)

В частичном представлении у меня нет Html.BeginForm (), поскольку тег формы уже визуализирован.

@model Introduction.Models.Human
<div>
    @Html.EditorFor(model => model.MarriageInformation.SpouseDetails)
    <div class="editor-label">
        @Html.LabelFor(model => model.MarriageInformation.DOM)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.MarriageInformation.DOM)
        @Html.ValidationMessageFor(model => model.MarriageInformation.DOM)
    </div>
</div>

Проблема, с которой я сталкиваюсь, в этом случае EditorFor не возвращает все атрибуты data-val- *.

<div>
   <div class="editor-label">
    <label for="MarriageInformation_SpouseDetails_Name">Name</label>
</div>
<div class="editor-field"><input class="text-box single-line" id="MarriageInformation_SpouseDetails_Name" name="MarriageInformation.SpouseDetails.Name" type="text" value="" /> 

Это по замыслу или я что-то здесь упускаю? Здесь есть какая-нибудь работа?

Опция, о которой я думаю, это после загрузки AJAX - вырезать форму и добавить внутреннее содержимое.

Ответы [ 2 ]

23 голосов
/ 19 июня 2011

вы правы, предполагая, что это сделано намеренно. если вы проверите источник , вы увидите следующее:

// Only render attributes if unobtrusive client-side validation is enabled, and then only if we've
// never rendered validation for a field with this name in this form. Also, if there's no form context,
// then we can't render the attributes (we'd have no <form> to attach them to).
public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)

Чтобы исправить это, мы можем написать метод расширения для использования в нашем частичном представлении:

public static class HtmlExtentions
{
    public static void EnablePartialViewValidation(this HtmlHelper helper)
    {
        if (helper.ViewContext.FormContext == null)
        {
            helper.ViewContext.FormContext = new FormContext();
        }
    }
}

А затем используйте его в нашем частичном представлении:

@model Introduction.Models.Human
@{ Html.EnablePartialViewValidation(); }
<div>
    @Html.EditorFor(model => model.MarriageInformation.SpouseDetails)
    <div class="editor-label">
        @Html.LabelFor(model => model.MarriageInformation.DOM)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.MarriageInformation.DOM)
        @Html.ValidationMessageFor(model => model.MarriageInformation.DOM)
    </div>
</div>

Последний шаг - обработка новых атрибутов проверки в нашем обратном вызове ajax:

$(function () {
    $('button').click(function (e) {
        e.preventDefault();
        $.get('@Url.Action("AddSpouse")', function (resp) { 
            var $form = $('form');
            $form.append(resp);                    
            $form.removeData("validator").removeData("unobtrusiveValidation");
            $.validator.u‌​nobtrusive.parse($form);
        })
    })
});
2 голосов
/ 07 февраля 2012

Если вы хотите, чтобы теги проверки данных были там, вы должны быть в FormContext.Следовательно, если вы динамически генерируете части своей формы, вам нужно включить в свой частичный вид следующую строку:

@{ if(ViewContext.FormContext == null) {ViewContext.FormContext = new FormContext(); }}

Затем вам нужно будет убедиться, что вы динамически перепривязываете свою ненавязчивую проверку каждый раз, когда добавляете/ удалить элементы:

$("#form").removeData("validator");
$("#form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("#form");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...