StringLength vs MaxLength แอตทริบิวต์ ASP.NET MVC พร้อม Entity Framework รหัส EF ก่อน


152

พฤติกรรม[MaxLength]และ[StringLength]คุณลักษณะต่างกันอย่างไร

เท่าที่ฉันสามารถบอกได้ (ยกเว้นว่า[MaxLength]สามารถตรวจสอบความยาวสูงสุดของอาร์เรย์) สิ่งเหล่านี้เหมือนกันและซ้ำซ้อนบ้างหรือไม่


1
ฉันไม่แน่ใจเกี่ยวกับ ASP.NET MVC แต่สำหรับ EF ไม่ควรมีความแตกต่าง: stackoverflow.com/questions/5414611/…
Ladislav Mrnka

1
stringLength ไม่มีผลต่อขนาดการย้ายข้อมูลเมื่อคุณเปลี่ยน
Cas Bloem

@CasBloem StringLength ทำในความเป็นจริงรับโดย EntityFramework และจะส่งผลกระทบต่อความยาวคอลัมน์ - อย่างน้อยในรุ่น 6
jakejgordon

คำตอบ:


203

MaxLengthใช้สำหรับ Entity Framework เพื่อตัดสินใจว่ามีขนาดใหญ่เพียงใดในการสร้างเขตข้อมูลค่าสตริงเมื่อสร้างฐานข้อมูล

จาก MSDN:

ระบุความยาวสูงสุดของอาร์เรย์หรือข้อมูลสตริงที่อนุญาตในคุณสมบัติ

StringLengthเป็นคำอธิบายประกอบข้อมูลที่จะใช้สำหรับการตรวจสอบการป้อนข้อมูลของผู้ใช้

จาก MSDN:

ระบุความยาวต่ำสุดและสูงสุดของอักขระที่ได้รับอนุญาตในเขตข้อมูล


10
นอกจากนี้โปรดทราบว่าโดยค่าเริ่มต้น MVC 3 ไม่เป็นที่รู้จักMaxLengthAttributeในขณะที่ EF ไม่รู้จักStringLengthAttribute
marcind

15
ดังนั้นจึงไม่มีความจำเป็นสำหรับ MaxLength เนื่องจากคุณสามารถใช้ StringLength ใน EF และยังทำให้ขนาดฟิลด์สตริง ทำไมพวกเขาถึงสร้าง MaxLength
Matt Johnson-Pint

4
@ MattJohnson - ฉันดูเหมือนจะจำได้ว่าการตัดสินใจที่จะสร้าง MaxLength คุณลักษณะใหม่สำหรับความหมายเพราะ StringLength หมายถึงข้อมูลสตริง แต่ MaxLength สามารถนำไปใช้กับข้อมูลไบนารีเช่นกัน แต่แน่นอนว่าเป็นนรกที่ไม่สะดวก
Josh

1
@MartinSmith - ฉันเพิ่งลองใช้ StringLength และมันใช้งานได้สำหรับฉันและฉันใช้ EF6 RC1 ดังนั้นฉันไม่คิดว่าความคิดเห็นที่ถูกต้อง
Colin

5
เหตุใดจึง[MaxLength]มี ErrorMessage
Zapnologica

46

ข้อมูลเพิ่มเติมที่รวดเร็ว แต่มีประโยชน์อย่างยิ่งที่ฉันเพิ่งเรียนรู้จากโพสต์อื่น แต่ดูเหมือนจะไม่พบเอกสารประกอบสำหรับ (ถ้าใครสามารถแชร์ลิงก์ไปยัง MSDN ที่น่าทึ่ง):

ข้อความตรวจสอบที่เกี่ยวข้องกับแอตทริบิวต์เหล่านี้จะแทนที่ตัวยึดตำแหน่งที่เชื่อมโยงกับแอตทริบิวต์ ตัวอย่างเช่น:

[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }

จะส่งออกข้อมูลต่อไปนี้หากเกินขีด จำกัด อักขระ: "ที่อยู่สามารถมีอักขระได้สูงสุด 100 ตัว"

ตัวยึดที่ฉันทราบคือ:

  • {0} = ชื่อคุณสมบัติ
  • {1} = ความยาวสูงสุด
  • {2} = ความยาวขั้นต่ำ

ขอบคุณมากสำหรับbloudraakสำหรับการเริ่มต้นชี้เรื่องนี้


12

ต่อไปนี้เป็นผลเมื่อเราใช้ทั้งสอง[MaxLength]และคุณลักษณะใน[StringLength] EF code firstหากใช้ทั้งคู่ให้[MaxLength]ชนะการแข่งขัน ดูผลการทดสอบในstudentnameคอลัมน์ด้านล่างคลาส

 public class Student
 {
    public Student () {}

    [Key]
    [Column(Order=1)]
    public int StudentKey { get; set; }

    //[MaxLength(50),StringLength(60)]    //studentname column will be nvarchar(50)
    //[StringLength(60)]    //studentname column will be nvarchar(60)
    [MaxLength(50)] //studentname column will be nvarchar(50)
    public string StudentName { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
 }

7

คำตอบที่ดีทั้งหมด ... จากมุมมองการตรวจสอบความถูกต้องฉันยังสังเกตเห็นว่า MaxLength ได้รับการตรวจสอบความถูกต้องที่ฝั่งเซิร์ฟเวอร์เท่านั้นในขณะที่ StringLength จะได้รับการตรวจสอบความถูกต้องที่ฝั่งไคลเอ็นต์ด้วย


4

MaxLengthAttribute หมายถึง Max ความยาวของอาเรย์หรือข้อมูลสตริงที่ได้รับอนุญาต

StringLengthAttribute หมายถึงขั้นต่ำ และสูงสุด ความยาวของอักขระที่ได้รับอนุญาตในเขตข้อมูล

เยี่ยมชมhttp://joeylicc.wordpress.com/2013/06/20/asp-net-mvc-model-validation-using-data-annotations/


3

อีกจุดหนึ่งที่ควรจดบันทึกอยู่ในแอตทริบิวต์MaxLengthคุณสามารถระบุช่วงที่ต้องการสูงสุดเท่านั้นไม่ใช่ช่วงที่ต้องการขั้นต่ำ ในขณะที่ในStringLengthคุณสามารถให้ทั้งสอง


4
ใช่ แต่นี่น่าจะเป็นเหตุผลว่าทำไมถึงมีแอตทริบิวต์MinLength
Ian Griffiths

1

ฉันได้แก้ไขโดยเพิ่มบรรทัดด้านล่างในบริบทของฉัน:

modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);

อย่างใด[MaxLength]ไม่ได้ผลสำหรับฉัน


0

เมื่อใช้แอ็ตทริบิวต์เพื่อจำกัดความยาวสูงสุดของข้อความจากแบบฟอร์มบนหน้าเว็บ StringLength จะสร้างแอตทริบิวต์ html maxlength (อย่างน้อยในการทดสอบของฉันกับ MVC 5) หนึ่งที่จะเลือกจากนั้นขึ้นอยู่กับว่าคุณต้องการเตือนผู้ใช้ว่านี่คือความยาวข้อความสูงสุด ด้วยแอตทริบิวต์ stringlength ผู้ใช้จะไม่สามารถพิมพ์เกินความยาวที่อนุญาต แอตทริบิวต์ maxlength ไม่ได้เพิ่มแอตทริบิวต์ html นี้ แต่จะสร้างแอตทริบิวต์การตรวจสอบข้อมูลซึ่งหมายความว่าผู้ใช้สามารถพิมพ์เกินความยาวที่ระบุและการป้องกันการป้อนข้อมูลอีกต่อไปขึ้นอยู่กับการตรวจสอบใน javascript เมื่อเขาย้ายไปที่ฟิลด์ถัดไปหรือคลิกส่ง (หรือ หากปิดการใช้งานจาวาสคริปต์การตรวจสอบฝั่งเซิร์ฟเวอร์) ในกรณีนี้ผู้ใช้สามารถได้รับแจ้งข้อ จำกัด โดยข้อความแสดงข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.