Html.HiddenFor ทำอะไร?


106

แม้ว่าฉันจะอ่านเอกสารเกี่ยวกับ Html.HiddenFor แต่ฉันไม่เข้าใจว่ามันใช้สำหรับอะไร ...

ใครช่วยอธิบายการใช้งานและยกตัวอย่างสั้น ๆ ได้ไหม

ตัวช่วยเหล่านั้นควรอยู่ที่ไหนในรหัส?

คำตอบ:


113

จะสร้างอินพุตที่ซ่อนอยู่ในแบบฟอร์มสำหรับฟิลด์ (จากโมเดลของคุณ) ที่คุณส่งผ่าน

มีประโยชน์สำหรับฟิลด์ใน Model / ViewModel ของคุณที่คุณต้องคงอยู่บนเพจและส่งกลับไปเมื่อมีการโทรอีกครั้ง แต่ผู้ใช้ไม่ควรมองเห็น

พิจารณาคลาส ViewModel ต่อไปนี้:

public class ViewModel
{
    public string Value { get; set; }
    public int Id { get; set; }
}

ตอนนี้คุณต้องการให้หน้าแก้ไขเก็บ ID แต่ไม่เห็น:

<% using(Html.BeginForm() { %>
    <%= Html.HiddenFor(model.Id) %><br />
    <%= Html.TextBoxFor(model.Value) %>
<% } %>

ผลลัพธ์นี้เทียบเท่ากับ HTML ต่อไปนี้:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>

<% = Html.HiddenFor (model.Id)%> <br /> ในตัวอย่างของเขาด้านบน
Bryce Fischer

11
ฉันจะบอกว่า "เห็น" โดยผู้ใช้ ผู้ใช้สามารถ "แก้ไข" สิ่งที่ต้องการซ่อนหรือไม่ก็ได้
Craig Stuntz

@ Craig - คุณพูดถูก ที่จริงฉันเปลี่ยนคำพูดนั้น แต่ดูเหมือนจะไม่ใช่
Justin Niessner

และโดยทั่วไปจะใช้สำหรับ ID (ดังตัวอย่างด้านบน) ซึ่งโดยทั่วไปคุณไม่ต้องการแสดง
RickAndMSFT

ฉันสับสนเล็กน้อยเพราะโมเดลมุมมองไม่ใช่พารามิเตอร์ของคอนโทรลเลอร์ เหตุใดชื่ออินพุตจึงถูกสร้างขึ้นในฟิลด์ของโมเดลมุมมอง?
ยอห์น

8

และหากต้องการใช้อินพุต ID ที่ซ่อนอยู่ในวิธีการแก้ไขการดำเนินการของคุณ:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}

8
แม้ว่าจะเป็นความจริงในทางเทคนิค แต่คุณไม่ควรทำเช่นนี้หากพิมพ์แบบฟอร์มลงในโมเดลมุมมองอย่างมาก คุณควรจะสามารถเข้าถึงโมเดลได้โดยตรงซึ่งไม่จำเป็นต้องทำการแปลงใด ๆ
Yetti

@ Yetti: ไม่ถูกต้อง มีเหตุผลที่ดีที่กลไกการนั่งร้านจะเพิ่มฟิลด์ ID ลบออกจากบทช่วยสอนของฉันและใช้ Fiddler เพื่อดูว่าไม่มีอยู่ในเนื้อหาของโพสต์
RickAndMSFT

2
ฉันไม่แน่ใจว่าความคิดเห็นไม่ถูกต้องอย่างไร ถ้า Model เป็นคุณสมบัติสำหรับ () 'd ในมุมมองเมธอดคอนโทรลเลอร์ควรถูกพิมพ์อย่างมากและถูกเติมโดย ModelBinder โดยอัตโนมัติ
Erik Philips

2

เช่นเดียวกับฟังก์ชั่นมากมายอันนี้สามารถใช้ในหลาย ๆ วิธีในการแก้ปัญหาที่แตกต่างกันฉันคิดว่ามันเป็นอีกเครื่องมือหนึ่งในเครื่องมือของเรา

จนถึงขณะนี้การสนทนาได้มุ่งเน้นไปที่การซ่อน ID เพียงอย่างเดียว แต่นั่นเป็นเพียงค่าเดียวทำไมไม่ใช้เพื่อเพิ่มมูลค่ามากมาย! นั่นคือสิ่งที่ฉันกำลังทำฉันใช้มันเพื่อโหลดค่าในคลาสเพียงครั้งละหนึ่งมุมมองเนื่องจาก html.beginform สร้างวัตถุใหม่และถ้าวัตถุโมเดลของคุณสำหรับมุมมองนั้นมีค่าบางอย่างที่ส่งผ่านไปแล้วสิ่งเหล่านั้น ค่าจะหายไปเว้นแต่คุณจะให้การอ้างอิงถึงค่าเหล่านั้นในแบบเริ่มต้น

หากต้องการดูแรงจูงใจที่ดีสำหรับ html.hiddenfor ฉันขอแนะนำให้คุณดูการส่งข้อมูลจากมุมมองไปยังคอนโทรลเลอร์ใน. NET MVC - "@model" ไม่ได้เน้น


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