MVC4.Net, элементы управления скрытыми полями

Интересно, возможно ли иметь элементы управления (анотация данных) в скрытых полях (HiddenFor или hidden EditorFor)?

Я так не думаю, но мы никогда не знаем.

Есть много сообщений о том, как скрыть EditorFor, например: и htmlAttributes против дополнительных ViewData

В моем случае в представлении у меня есть jquery-вызов службы WCF REST, который в случае успеха заполняет мой EditorFor. Я хотел бы, чтобы Required DataAnotation применялся к этому EditorFor, возможно ли это?

Я думаю, что пока EditorFor невидим, DataAnotation не может быть применена. Будет ли способ применить DataAnotation к скрытому EditorFor ?


Вот код: Чтобы скрыть EditorFor:

@Html.EditorFor(model => model.VilleDepart, "CustomEditor", new {style = "display:none;" })

Пользовательский редактор:

@{
    string s = "";
    if (ViewData["style"] != null) {
        // The ViewData["name"] is the name of the property in the addtionalViewData...
        s = ViewData["style"].ToString();
    }
}

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { style = s })

модель :

string _VilleDepart;
[Required]
[Display(Name = "Ville Départ")]
public string VilleDepart
{
    get
    {
        if (Commune != null) {
            return Commune.Commune1;
        }

        return _VilleDepart;
    }
    set {
        _VilleDepart = value;
    }
}

Вызов JQuery для службы WCF REST:

$(document).ready(function () {
    $([document.getElementById("IVilleDepart"), document.getElementById("IVilleArrivee")]).autocomplete({
        source: function (request, response) {
            $.ajax({
                cache: false,
                type: "GET",
                async: false,
                dataType: "json",
                url: GetSearchCommunetURl + "(" + request.term + ")",
                success: function (data) {
                    //alert(data);
                    response($.map(data, function (item) {
                        return {
                            label: item['Commune'] + ' (' + item['CodePostal'] + ')',
                            val: item
                        }
                    }))
                },
                error: function (response) {
                    alert("error ==>" + response.statusText);
                },
                failure: function (response) {
                    alert("failure ==>" + response.responseText);
                }
            });
        },
        select: function (e, i) {
            if (e.target.id == "IVilleDepart") {
                VilleDepart = i.item.val;
                EVilleDepart.value = VilleDepart.Commune;
                ECodePostalDepart.value = VilleDepart.CodePostal;
                ECodeINSEEDepart.value = VilleDepart.CodeINSEE;

            }
            if (e.target.id == "IVilleArrivee") {
                VilleArrivee = i.item.val;
                EVilleArrivee.value = VilleArrivee.Commune;
                ECodePostalArrivee.value = VilleArrivee.CodePostal;
                ECodeINSEEArrivee.value = VilleArrivee.CodeINSEE;
            }
        },
        minLength: 2
    });
});

Если я не скрываю EditorFor, я вижу, что он правильно заполнен после вызова службы WCF REST и применяется Required DataAnotation.

Есть и другой способ скрыть EditorFor, например, применить style='width:0px;height:0px'

Он скрывает, но отключает Required DataAnotation,

если я применяю стиль = 'ширина: 0px; высота: 1px', мы не видим много EditorFor, но Required DataAnotation активен.


person fguigui    schedule 04.11.2013    source источник
comment
Я думаю, что DataAnnotation применяется к полю независимо от того, скрыт EditorFor или нет. Можете ли вы опубликовать код, который не работает, вашу ViewModel и View?   -  person freshbm    schedule 04.11.2013
comment
Да, проверка все равно будет работать.   -  person WannaCSharp    schedule 04.11.2013
comment
Проверка не работает со скрытым полем. У вас есть несколько примеров, когда проверка работает с HiddenFor ?   -  person fguigui    schedule 05.11.2013


Ответы (1)


Я видел ответ на http://www.campusmvp.net/blog/validation-of-hidden-fields-at-the-client-in-asp-net-mvc

(но, кажется, я плохо искал ранее, проверка скрытого поля обрабатывается в некоторых блогах и сайтах).

Чтобы активировать проверку скрытых полей, вам просто нужно добавить эту небольшую строку javascript:

$.validator.setDefaults({ ignore: null });

и это работает!

Судя по всему, это не работает с mvc2, но работает с mvc3.

person fguigui    schedule 06.11.2013