Необязательное свойство продолжает получать атрибут data-val-required - PullRequest
53 голосов
/ 15 января 2011

Это модель с проверкой:

[MetadataType(typeof(TagValidation))]
public partial class Tag
{
}

public class TagValidation
{
        [Editable(false)]
        [HiddenInput(DisplayValue = false)]
        public int TagId { get; set; }

        [Required]
        [StringLength(20)]
        [DataType(DataType.Text)]
        public string Name { get; set; }
    //...
}

Вот вид:

    <h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Tag</legend>

        <div>@Html.EditorForModel()</div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

А вот что получит get:

<form action="/Tag/Create" method="post">
    <fieldset>
        <legend>Tag</legend>
        <div><input data-val="true" data-val-number="The field TagId must be a number." data-val-required="The TagId field is required." id="TagId" name="TagId" type="hidden" value="" />

        <div class="editor-label"><label for="Name">Name</label></div>
        <div class="editor-field"><input class="text-box single-line" data-val="true" data-val-length="The field Name must be a string with a maximum length of 20." data-val-length-max="20" data-val-required="The Name field is required." id="Name" name="Name" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span></div>            
    ...
    </fieldset>
</form>

Проблема в том, что проверка TagId генерируется, хотя в свойстве TagId не установлен обязательный атрибут. Из-за этого я даже не могу пройти проверку на стороне клиента, чтобы создать новый тег в БД. Чего мне не хватает?

Ответы [ 7 ]

99 голосов
/ 31 января 2011

Я нашел ответ. Просто добавьте это к Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
22 голосов
/ 22 августа 2012

Делает типы значений модели представления обнуляемыми. Тогда они не будут обязательными по умолчанию.

Обратите внимание, что если вы поместите атрибут 'required = "false" в html 5 (если вы задали html 5 в метаданных типа документа), он увидит "required" и сделает его обязательным. Вы можете использовать dojo-data-props = "required: false".

4 голосов
/ 15 ноября 2012

решение Френнки только удалило data-val-required, но в моем случае у меня все еще были data-val-number и data-val

Мне пришлось добавить две строки ниже в Application_Start, чтобы избавиться от всего.

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
3 голосов
/ 18 февраля 2011

jquery проверяет целевую проверку "отключен" атрибут html.

$(function () { 
  $("#TagId").attr("disabled", "disabled") 
});

или используйте Nullable.

надеюсь, что этот код!

3 голосов
/ 15 января 2011

Проблема в том, что значение скрытого поля пустое.Этого не должно быть, если вы используете целочисленный тип.Я предполагаю, что свойство TagId определено как обнуляемый тип в классе Tag.Поэтому либо присвойте ему значение перед рендерингом представления, либо используйте целочисленный тип:

[MetadataType(typeof(TagValidation))]
public partial class Tag
{
    public int TagId { get; set; }
    public string Name { get; set; }
}

, чтобы сгенерированное скрытое поле выглядело так:

<input 
    data-val="true" 
    data-val-number="The field TagId must be a number." 
    data-val-required="The TagId field is required." 
    id="TagId" 
    name="TagId" 
    type="hidden" 
    value="0" 
/>

Также обычно проверка на стороне клиентане сработает для этого скрытого поля.

2 голосов
/ 07 января 2017

С MVC4 вы также можете использовать это:

@{ Html.EnableClientValidation(false); }
@Html.EditorForModel()
@{ Html.EnableClientValidation(true); }
0 голосов
/ 07 сентября 2017

Сделайте ваши свойства Model или View-Model значениями типа "nullabel". Это решит вашу проблему. Одна важная вещь, которая удалит атрибут «required» из вашего тега, в противном случае потребуется «Требуется»

Пример: -

public class ViewModle
{
    public int? foo{get;set;}
}

Здесь в примере foo - это целочисленный обнуляемый тип, это больше не требуется в mvc.

Надеюсь, это поможет вам.

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