2011-01-15 18 views
49

Đây là mô hình với đó là xác nhận:tài sản unrequired giữ lấy dữ liệu-val-cần thuộc tính

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

Sau đây là quan điểm:

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

Và đây là của những gì có được 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> 

Vấn đề là việc xác thực TagId được tạo ra không phải là vấn đề quan trọng là không có thuộc tính Bắt buộc được đặt trên thuộc tính TagId. Do đó, tôi thậm chí không thể vượt qua xác thực phía máy khách để tạo Thẻ mới trong db. Tôi đang thiếu gì?

Trả lời

93

Tôi đã tìm thấy câu trả lời. Chỉ cần thêm số này vào Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
+0

Đã lưu ngày của tôi !!! – kheya

+0

Cảm ơn. Đã lưu cả ngày của tôi nữa. Theo tôi, đây là hành vi ngược. Sai phải là mặc định. – Anish

+1

@frnnky Tôi đã thêm điều này nhưng nó không giải quyết [link] (http://stackoverflow.com/questions/14452344/remove-required-property) Biểu tượng của tôi. bạn sẽ giúp tôi nhé Cảm ơn bạn – Amol

3

Vấn đề là giá trị của trường ẩn trống. Điều này sẽ không xảy ra nếu bạn sử dụng kiểu số nguyên. Tôi cho rằng thuộc tính TagId được định nghĩa là một loại nullable trong lớp Tag. Vì vậy, hoặc gán cho nó một giá trị trước khi render xem hoặc sử dụng một kiểu số nguyên:

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

để các lĩnh vực tiềm ẩn tạo ra trông như thế này:

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

Cũng bình thường xác nhận phía khách hàng nên không được kích hoạt cho trường ẩn này.

+0

Trước tiên, TagId không thể vô hiệu hóa, nó chỉ là int. Thứ hai, đánh dấu được tạo ra bởi trình trợ giúp html EditorForModel vì vậy tôi không có quyền kiểm soát nó. Để đặt giá trị thành 0, tôi cho rằng tôi có thể gửi một phiên bản trống của Thẻ để Tạo trang, nhưng đó không phải là giải pháp mà tôi đang tìm kiếm. – frennky

3

jquery xác thực mục tiêu cheking "đã tắt" thuộc tính html.

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

hoặc sử dụng Nullable.

hy vọng mã này!

16

Đặt kiểu giá trị kiểu xem không thể thực hiện được. Sau đó, chúng sẽ không được yêu cầu theo mặc định.

Cũng lưu ý nếu bạn đặt thuộc tính 'required = "false"' trong html 5 (nếu bạn đặt html 5 trong dữ liệu meta doctype của mình), nó sẽ thấy "bắt buộc" và yêu cầu. Bạn có thể sử dụng dojo-data-props = "required: false". giải pháp

+2

Tại sao lại là downvote? Làm cho thuộc tính nullable là một cách hợp lệ để giải quyết vấn đề này mà không cần phải thực hiện các thay đổi trên toàn hệ thống trong Application_Start. – StuartQ

+1

@StuartQ Tôi đồng ý với bạn vì vậy tôi đã bỏ phiếu để bỏ phiếu bầu. Làm cho thuộc tính nullable là một cách hợp lệ để giải quyết vấn đề này. Nó làm việc cho tôi. –

+0

Chắc chắn là câu trả lời tốt hơn! Tôi không muốn thay đổi hệ thống để giải quyết một vấn đề trong một chế độ xem. Chúc mừng – Johny

4

frennky của chỉ loại bỏ data-val-required nhưng trong trường hợp của tôi, tôi vẫn có data-val-numberdata-val

tôi đã có thêm hai dòng dưới đây để Application_Start để thoát khỏi tất cả mọi thứ.

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

Tôi tự hỏi những tác dụng phụ nào mà mã này có thể có? – nuander

+1

@nuander quan tâm hợp lệ. Điều này giống như sử dụng một cái búa tạ để crack một hạt. – Stijn

+0

có câu trả lời dễ dàng hơn cho tôi ở đây http://stackoverflow.com/questions/14452344/mvc3-removed-required-but-keeps-getting-data-val-required-attribute – TechnicalSmile

1

Với MVC4 bạn cũng có thể sử dụng này:

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

Hãy mẫu hoặc tài sản View-Model của bạn có giá trị loại "nullabel". Điều này sẽ giải quyết vấn đề của bạn.Một điều quan trọng là loại bỏ "yêu cầu" thuộc tính từ thẻ của bạn nếu không nó sẽ mất tôi "yêu cầu"

Ví dụ: -

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

đây trong ví dụ foo là loại nullable số nguyên, điều này sẽ không còn cần thiết trong MVC .

Hy vọng điều này sẽ giúp bạn.

Các vấn đề liên quan