2011-01-15 4 views
49

Dieses Modell ist damit die Validierung ist:Nicht benötigte Eigenschaft wird immer Daten-val-erforderliches Attribut

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

Hier ist der Ansicht:

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

Und hier ist das, was erhalten ist 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> 

Das Problem besteht darin, dass die TagId-Validierung generiert wird, obwohl kein erforderliches Attribut für die TagId-Eigenschaft festgelegt ist. Aus diesem Grund kann ich nicht einmal die clientseitige Validierung übergeben, um ein neues Tag in db zu erstellen. Was fehlt mir?

Antwort

93

Ich fand die Antwort. Fügen Sie einfach diese zu Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
+0

Habe meinen Tag gerettet !!! – kheya

+0

Danke. Habe auch meinen Tag gerettet. Meiner Meinung nach ist das Rückwärtsverhalten. Falsch sollte der Standardwert sein. – Anish

+1

@frnnky Ich habe dies hinzugefügt, aber es löste [link] (http://stackoverflow.com/questions/14452344/remove-required-property) Mein Prblem. Wirst du mir bitte helfen? Danke – Amol

3

Das Problem ist, dass der Wert des ausgeblendeten Felds leer ist. Dies sollte nicht passieren, wenn Sie den Integer-Typ verwenden. Ich nehme an, dass die TagId-Eigenschaft als Nullable Typ in der Tag Klasse definiert ist. Also entweder weisen Sie ihm den Wert vor der Ansicht, Rendering oder eine Integer-Typ verwenden:

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

so dass die erzeugte verstecktes Feld sieht wie folgt aus:

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

Auch normalerweise Clientseite Validierung sollte nicht ausgelöst werden für dieses versteckte Feld.

+0

Erstens, TagId ist nicht Nullable, es ist nur Int. Zweitens, Markup wird von HTML-Helper EditorForModel generiert, so dass ich keine Kontrolle darüber habe. Um den Wert auf 0 zu setzen, könnte ich eine leere Instanz von Tag auf Create page senden, aber das ist nicht die Lösung, nach der ich suche. – frennky

3

jquery Validate Ziel cheking "disabled" HTML-Attribut.

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

oder Nullable verwenden.

hoffe diesen Code!

16

Setzen Sie die Werttypen des Ansichtsmodells auf Nullwerte. Dann werden sie standardmäßig nicht benötigt.

Beachten Sie auch, wenn Sie das Attribut 'required = "false"' in HTML 5 (wenn Sie HTML 5 in Ihren Doctype-Metadaten setzen), wird es "erforderlich" sehen und machen es erforderlich. Sie können dojo-data-reps = "required: false" verwenden.

+2

Warum der Downvote? Das Anwenden der NULL-Eigenschaft ist ein gültiger Weg, um dieses Problem zu beheben, ohne systemweite Änderungen in Application_Start vornehmen zu müssen. – StuartQ

+1

@StuartQ Ich stimme dir zu, also habe ich es gewählt, um die Down-Abstimmung zu entfernen. Das Anwenden der NULL-Eigenschaft ist eine gültige Methode, um dieses Problem zu beheben. Es hat für mich funktioniert. –

+0

Definitiv die bessere Antwort! Ich möchte lieber keine systemweiten Änderungen vornehmen, um ein Problem auf einen Blick zu lösen. Prost – Johny

4

frennky Lösung entfernt nur data-val-required aber in meinem Fall hatte ich noch data-val-number und data-val

ich die beiden folgenden Zeilen zu Application_Start hinzuzufügen hatte loswerden alles zu bekommen.

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

Ich frage mich, welche Nebenwirkungen dieser Code haben könnte? – nuander

+1

@nuander gültige Bedenken. Das ist wie mit einem Vorschlaghammer, um eine Nuss zu knacken. – Stijn

+0

bekam eine einfachere Antwort, die für mich hier funktioniert http://stackoverflow.com/questions/14452344/mvc3-removed-required-but-keeps-getting-data-val-required-attribute – TechnicalSmile

1

Mit MVC4 können Sie diese auch verwenden:

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

Sie Ihr Modell oder View-Modell Eigenschaftswert-Typen "nullabel". Dies wird dein Problem lösen.Eine wichtige Sache, die „erforderlich“ -Attribut von Ihrem Tag entfernt sonst wird es dauern, i „erforderlich“

Beispiel: -

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

Hier in Beispiel foo integer Nullable Type sind, wird dies nicht mehr erforderlich, in mvc .

Hoffe, das wird Ihnen helfen.

Verwandte Themen