Необязательное свойство продолжает получать атрибут data-val-required
Это модель с проверкой:
[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>
А вот что получилось:
<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 не установлен обязательный атрибут. Из-за этого я даже не могу пройти проверку на стороне клиента, чтобы создать новый тег в БД. Что мне не хватает?
8 ответов
Я нашел ответ. Просто добавьте это к Application_Start
:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Сделайте типы значений модели представления обнуляемыми. Тогда они не будут обязательными по умолчанию.
Также обратите внимание, что если вы поместите атрибут 'required="false" в html 5 (если вы установите html 5 в метаданных типа документа), он увидит "required" и сделает его обязательным. Вы можете использовать dojo-data-props="required:false".
Решение Френнки только удалено data-val-required
но в моем случае у меня все еще было data-val-number
а также data-val
Мне пришлось добавить две строки ниже в Application_Start, чтобы избавиться от всего.
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
JQuery проверить целевую проверку "отключен" атрибут HTML.
$(function () {
$("#TagId").attr("disabled", "disabled")
});
или используйте Nullable.
надеюсь, что этот код!
Проблема в том, что значение скрытого поля пусто. Этого не должно случиться, если вы используете целочисленный тип. Я предполагаю, что свойство 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"
/>
Также обычно проверка на стороне клиента не должна запускаться для этого скрытого поля.
С MVC4 вы также можете использовать это:
@{ Html.EnableClientValidation(false); }
@Html.EditorForModel()
@{ Html.EnableClientValidation(true); }
У меня был неудачный опыт, когда атрибуты моей модели внезапно потребовались, из-за чего мои веб-API возвращали 400 ошибок, когда атрибуты отсутствовали в веб-запросах.
Я обнаружил, что это было вызвано случайным изменением параметра «Обнуляемый» в проекте (Свойства проекта -> Сборка -> Обнуляемый: Включить)
После изменения Nullable на Disable все снова стало хорошо.
Я нашел более подробное объяснение проблемы здесь:
https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references#nullable-contexts
Сделайте ваши значения свойств Model или View-Model "nullabel". Это решит вашу проблему. Одна важная вещь, которая удаляет атрибут "required" из вашего тега, в противном случае это займет "я"
Пример:-
public class ViewModle
{
public int? foo{get;set;}
}
Здесь, например, foo - это целочисленный обнуляемый тип, это больше не требуется в mvc.
Надеюсь, что это поможет вам.