ความแตกต่างระหว่าง Html.TextboxFor และ Html.EditorFor ใน MVC และมีดโกน


170

ทำไมค่าเริ่มต้นถึงถูกเปลี่ยนเมื่อเพิ่มมุมมอง "แก้ไข" ใหม่ อะไรคือข้อดีเมื่อใช้EditorFor()กับTextboxFor()?

ฉันพบสิ่งนี้

ตามค่าเริ่มต้นตอนนี้สร้างและแก้ไข scaffolds ใช้ตัวช่วย Html.EditorFor แทนตัวช่วย Html.TextBoxFor สิ่งนี้ช่วยปรับปรุงการรองรับข้อมูลเมตาบนโมเดลในรูปแบบของแอตทริบิวต์คำอธิบายประกอบข้อมูลเมื่อกล่องโต้ตอบเพิ่มมุมมองสร้างมุมมอง


5
ไม่มีใครมีตัวอย่างของวิธีการทำเช่นนี้? เช่นเขียนแก้ไขสำหรับ DatePicker?
ShaneKm

คำตอบ:


166

ข้อดีของการเป็นว่ารหัสของคุณไม่ได้เชื่อมโยงกับEditorFor <input type="text"ดังนั้นถ้าคุณตัดสินใจที่จะสิ่งที่เปลี่ยนแปลงในด้านของวิธี textboxes ของคุณจะกลายเป็นเหมือนการตัดพวกเขาในการที่divคุณก็สามารถเขียนแม่แบบแก้ไขที่กำหนดเอง ( ~/Views/Shared/EditorTemplates/string.cshtml) และ textboxes ของคุณทั้งหมดในใบสมัครของคุณจะได้รับประโยชน์โดยอัตโนมัติจากการเปลี่ยนแปลงนี้ในขณะที่ถ้าคุณได้ hardcoded Html.TextBoxForคุณ จะต้องแก้ไขมันทุกที่ คุณสามารถใช้คำอธิบายประกอบข้อมูลเพื่อควบคุมวิธีการแสดงผลนี้


มีข้อผิดพลาดอาจเป็นรุ่นเก่า EditorFor ไม่รู้จัก 'สองเท่า' สำหรับ 'long' จะถือว่าเป็น 'int' และ step = "0.01" ไม่ทำงานในคุณลักษณะดังนั้นฉันจึงใช้ TextBoxFor และเพิ่ม @ type = 'number' @ step = "0.01" ดังนั้นจึงใช้ได้
Charlie

129

TextBoxFor : มันจะแสดงผลเหมือนองค์ประกอบข้อความ HTML ที่สอดคล้องกับนิพจน์ที่ระบุ ในคำง่าย ๆ มันจะแสดงผลเหมือนกล่องข้อความเข้าโดยไม่คำนึงถึงประเภทข้อมูลของคุณสมบัติที่ได้รับการผูกกับตัวควบคุม

EditorFor : การควบคุมนี้เป็นบิตที่ชาญฉลาด มันแสดงผลมาร์กอัป HTML ตามประเภทของคุณสมบัติ เช่นสมมติว่ามีคุณสมบัติบูลีนในรูปแบบ ในการแสดงคุณสมบัตินี้ในมุมมองเป็นช่องทำเครื่องหมายเราสามารถใช้ CheckBoxFor หรือ EditorFor ทั้งสองจะสร้างมาร์กอัปเดียวกัน

ข้อดีของการใช้ EditorFor คืออะไร

ดังที่เราทราบทั้งนี้ขึ้นอยู่กับประเภทข้อมูลของคุณสมบัติที่สร้างมาร์กอัป html ดังนั้นสมมติว่าพรุ่งนี้ถ้าเราเปลี่ยนประเภทข้อมูลของคุณสมบัติในโมเดลไม่จำเป็นต้องเปลี่ยนแปลงอะไรในมุมมอง การควบคุม EditorFor จะเปลี่ยนมาร์กอัป html โดยอัตโนมัติ


15
คำตอบที่ดีและเรียบง่ายซึ่งสามารถดูดซึมได้ง่ายแม้เป็นสามเณร
Kings

คำอธิบายข้างต้นจะช่วยให้ลิงค์นี้ฟอ รัม. asp.net/t/1948071.aspx?EditorFor+and+EditorForModel
Amol Shiledar

เคยมีกรณีที่คุณควรใช้ TextBoxFor หรือไม่?
eaglei22

55

Html.TextboxForจะสร้างช่อง ( <input type="text" ...)

ในขณะที่ EditorFor ดูที่ประเภทและข้อมูลเมตาและสามารถแสดงการควบคุมอื่นหรือเทมเพลตที่คุณจัดหา

ตัวอย่างเช่นสำหรับคุณสมบัติ DateTime คุณสามารถสร้างเทมเพลตที่ใช้ jQuery DatePicker


12
ตัวอย่างใด ๆ เกี่ยวกับวิธีการใช้ jQuery datepicker โดยใช้ editfor?
เปรู

2
ขอบคุณสำหรับการทำให้ความแตกต่างง่ายขึ้นโดยใช้ตัวพิมพ์วันที่และเวลา
Kings

1
@Peru, ที่นี่หรือนี่คือวิธีการimplement jquery datepickerและการใช้กับมัน EditorForอยู่ที่นี่
shaijut

8

นี้เป็นหนึ่งในความแตกต่างพื้นฐานที่ไม่ได้กล่าวถึงในความคิดเห็นก่อนหน้านี้: คุณสมบัติที่จะทำงานร่วมกับช่องและมันจะไม่ทำงานกับ
ReadonlyEditorFor

@Html.TextBoxFor(model => model.DateSoldOn, new { @readonly = "readonly" })

โค้ดด้านบนใช้งานได้คุณไม่สามารถควบคุมการอ่านได้อย่างเดียว

@Html.EditorFor(model => model.DateSoldOn, new { @readonly = "readonly" })

16
คุณสามารถสร้าง EditorFor แบบอ่านอย่างเดียวโดยใช้ไวยากรณ์ต่อไปนี้: @ Html.EditorFor (model => model.DateSoldOn, ใหม่ {htmlAttributes = ใหม่ {@readonly = "readonly"}})
Doug Knudsen

4

นอกจากนี้ยังมีความแตกต่างเล็กน้อยในเอาต์พุต html สำหรับชนิดข้อมูลสตริง

Html.EditorFor:  
<input id="Contact_FirstName" class="text-box single-line" type="text" value="Greg" name="Contact.FirstName">

Html.TextBoxFor:
<input id="Contact_FirstName" type="text" value="Greg" name="Contact.FirstName">

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