2011-01-15 11 views
49

Jest to model z jego walidacja:nieruchomość usunąć niepotrzebne staje się coraz danych val-wymagany atrybut

[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; } 
    //... 
} 

oto widok:

<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> 

A oto co get renderd:

<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> 

Problem polega na tym, że sprawdzanie znaczników TagId jest generowane niezależnie od tego, czy nie jest ustawiona wymagana właściwość dla właściwości TagId. Z tego powodu nie mogę nawet przekazać walidacji po stronie klienta w celu utworzenia nowego znacznika w db. Czego mi brakuje?

Odpowiedz

93

Znalazłem odpowiedź. Wystarczy dodać do tego Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
+0

Uratowałem mój dzień !!! – kheya

+0

Dzięki. Uratowałem też mój dzień. Moim zdaniem jest to zachowanie wstecz. Fałsz powinien być domyślny. – Anish

+1

@frnnky Dodałem to, ale to nie rozwiązało [link] (http://stackoverflow.com/questions/14452344/remove-required-property) Mój prblem. czy możesz mi pomóc. Dziękuję – Amol

3

Problem polega na tym, że wartość ukrytego pola jest pusta. Nie powinno się to zdarzyć, jeśli używasz typu całkowitoliczbowego. Przypuszczam, że właściwość TagId jest zdefiniowana jako klasa zerowalna w klasie Tag. Więc albo przypisać mu wartość przed renderowania widoku lub użyć typu integer:

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

tak, że ukryte pole generowane wygląda następująco:

<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" 
/> 

także normalnie walidacja po stronie klienta nie powinny być wyzwalane dla tego ukrytego pola.

+0

Po pierwsze, TagId nie jest zerowalny, to tylko int. Po drugie, znaczniki są generowane przez html helper EditorForModel, więc nie mam nad nim kontroli. Aby ustawić wartość na 0, przypuszczam, że mógłbym wysłać pustą instancję znacznika do strony Utwórz, ale to nie jest rozwiązanie, którego szukam. – frennky

3

jquery cel validate KONTROLA "wyłączone" atrybut html.

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

lub użyj Nullable.

nadzieję, że ten kod!

16

Spraw, aby typy wartości widoku były typu zerowego. Wtedy nie będą one domyślnie wymagane.

Uwaga: jeśli umieścisz atrybut "required =" false "" w html 5 (jeśli ustawisz html 5 w meta danych doctype), zobaczysz "wymagany" i sprawisz, że będzie on wymagany. Możesz użyć dojo-data-props = "required: false". Rozwiązanie

+2

Dlaczego upadek? Sprawienie, że właściwość jest nullable, jest ważnym sposobem rozwiązania tego problemu bez konieczności wprowadzania zmian w całym systemie w Application_Start. – StuartQ

+1

@StuartQ Zgadzam się z tobą, więc głosowałem za jego usunięciem. Sprawienie, że własność nullable jest ważnym sposobem na rozwiązanie tego problemu. To zadziałało dla mnie. –

+0

Zdecydowanie lepsza odpowiedź! Wolałbym nie wprowadzać ogólnosystemowych zmian w celu rozwiązania jednego problemu w jednym widoku. Pozdrawiam – Johny

4

frennky jedynie usunięte data-val-required ale w moim przypadku miałem jeszcze data-val-number i data-val

musiałem dodać dwie linie poniżej Application_Start pozbyć się wszystkiego.

ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider()); 
+3

Zastanawiam się, jakie skutki uboczne może mieć ten kod? – nuander

+1

@nuander ważny problem. To jest jak użycie młota do złamania nakrętki. – Stijn

+0

uzyskałem łatwiejszą odpowiedź, która zadziałała tutaj: http://stackoverflow.com/questions/14452344/mvc3-removed-required-but-keeps-getting-data-val-required-attribute – TechnicalSmile

1

Z MVC4 można również użyć tego:

@{ Html.EnableClientValidation(false); } 
@Html.EditorForModel() 
@{ Html.EnableClientValidation(true); } 
0

Dokonaj model lub property View-model Value-typy "nullabel". To rozwiąże twój problem.Jedną ważną rzeczą, że usunięcie „niezbędne” atrybut tagu inaczej potrwa i „niezbędne”

Przykład: -

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

Tutaj w przykładzie foo jest całkowitą zerowalne typu, to nie jest już wymagane w MVC .

Mam nadzieję, że to ci pomoże.

Powiązane problemy