วิธีสร้างกล่องข้อความแบบอ่านอย่างเดียวใน ASP.NET MVC3 Razor


118

ฉันจะสร้างกล่องข้อความแบบอ่านอย่างเดียวใน ASP.NET MVC3 ด้วย Razor view engine ได้อย่างไร

มีวิธี HTMLHelper ที่สามารถทำได้หรือไม่?

สิ่งต่อไปนี้?

@Html.ReadOnlyTextBoxFor(m => m.userCode)

คำตอบ:


246
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

คุณสามารถสร้างตัวช่วย HTML สำหรับสิ่งนี้ได้ แต่นี่เป็นเพียงแอตทริบิวต์ HTML เหมือนที่อื่น ๆ คุณจะสร้าง HTML Helper สำหรับกล่องข้อความที่มีคุณสมบัติอื่น ๆ หรือไม่?


1
@Shyju ขออภัยฉันไม่มี@คำนำหน้าreadonlyคุณสมบัติ ดูการแก้ไขของฉัน

7
ในอนาคตหากคุณได้รับข้อผิดพลาดใด ๆ ในการเพิ่มคุณสมบัติให้กับอาร์กิวเมนต์ออบเจ็กต์แบบไดนามิกคุณสามารถเติมคำนำหน้าด้วยไฟล์@. โดยปกติคุณจะเห็นเฉพาะคำหลักที่ตรงกับแอตทริบิวต์ HTML เท่านั้น (เช่นอ่านอย่างเดียวคลาส ฯลฯ )
Brad Christie

10
@BradChristie: เปล่า; คุณต้อง@ใช้แอตทริบิวต์ที่ตรงกับคำหลักC #เท่านั้น
SLaks

1
@BradChristie: ฉันอ่านความคิดเห็นของคุณผิด ("คำหลัก" คลุมเครือ)
SLaks

1
หากคุณมีแอตทริบิวต์ html หลายรายการคุณสามารถทำสิ่งต่อไปนี้@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
benscabbia

32

อัปเดต: ตอนนี้การเพิ่มแอตทริบิวต์ HTML ลงในเทมเพลตตัวแก้ไขเริ่มต้นทำได้ง่ายมาก แทนการทำสิ่งนี้:

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

คุณสามารถทำได้:

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })

ประโยชน์: คุณไม่ต้องโทร.TextBoxForฯลฯ สำหรับเทมเพลต เพียงโทร.EditorFor.


ในขณะที่โซลูชันของ @ Shark ทำงานได้อย่างถูกต้องและเรียบง่ายและมีประโยชน์ แต่โซลูชันของฉัน (ที่ฉันใช้เสมอ) คือวิธีนี้: สร้างแอนดรอยด์editor-templateที่สามารถจัดการreadonlyแอตทริบิวต์ :

  1. สร้างโฟลเดอร์ชื่อEditorTemplatesใน~/Views/Shared/
  2. สร้างมีดโกนPartialViewชื่อString.cshtml
  3. กรอกString.cshtmlรหัสนี้:

    @if(ViewData.ModelMetadata.IsReadOnly) {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })
    } else {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line" })
    }
  4. ในชั้นเรียนรุ่นใส่แอตทริบิวต์เกี่ยวกับคุณสมบัติที่คุณต้องการที่จะเป็น[ReadOnly(true)]readonly

ตัวอย่างเช่น,

public class Model {
    // [your-annotations-here]
    public string EditablePropertyExample { get; set; }

    // [your-annotations-here]
    [ReadOnly(true)]
    public string ReadOnlyPropertyExample { get; set; }
}

ตอนนี้คุณสามารถใช้ไวยากรณ์เริ่มต้นของ Razor ได้ง่ายๆ:

@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)

อันแรกแสดงผลปกติtext-boxดังนี้:

<input class="text-box single-line" id="field-id" name="field-name" />

และครั้งที่สองจะแสดงเป็น;

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />

คุณสามารถใช้วิธีนี้สำหรับประเภทของข้อมูลใด ๆ ( DateTime, DateTimeOffset, DataType.Text, DataType.MultilineTextและอื่น ๆ ) เพียงแค่สร้างeditor-templateไฟล์.


2
+1 เนื่องจากคุณใช้ "ViewData.ModelMetadata.IsReadOnly" ฉันคาดหวังว่า MVC จะคำนึงถึงสิ่งเหล่านี้ในเวอร์ชัน 4
cleftheris

@cleftheris ตอนนี้เราอยู่ในเวอร์ชัน 5 แล้วและ MVC ก็ยังไม่ได้ใช้;)
ravy amiry

2
@Javad_Amiry - คำตอบที่ดี - ฉันได้ใช้งานแล้วและดูเหมือนว่าจะใช้งานได้ดีจนกระทั่งฉันคลิกบันทึกในหน้าแก้ไขนั่งร้าน จากนั้นปรากฎ Properties ด้วย [ReadOnly (true)] จะส่งผลให้ NULL ถูกส่งไปยังฐานข้อมูลแทนค่า Property จริง - คุณเคยเจอสิ่งนี้หรือไม่?
Percy

5

วิธีแก้ปัญหาด้วย TextBoxFor ก็ใช้ได้ แต่ถ้าคุณไม่ต้องการเห็นฟิลด์เช่น EditBox มีสไตล์ (อาจทำให้ผู้ใช้สับสนเล็กน้อย) เกี่ยวข้องกับการเปลี่ยนแปลงดังนี้:

  1. รหัสมีดโกนก่อนการเปลี่ยนแปลง

    <div class="editor-field">
         @Html.EditorFor(model => model.Text)
         @Html.ValidationMessageFor(model => model.Text)
    </div>
  2. หลังการเปลี่ยนแปลง

    <!-- New div display-field (after div editor-label) -->
    <div class="display-field">
        @Html.DisplayFor(model => model.Text)
    </div>
    
    <div class="editor-field">
        <!-- change to HiddenFor in existing div editor-field -->
        @Html.HiddenFor(model => model.Text)
        @Html.ValidationMessageFor(model => model.Text)
    </div>

โดยทั่วไปโซลูชันนี้จะป้องกันไม่ให้มีการแก้ไขฟิลด์ แต่แสดงมูลค่าของมัน ไม่จำเป็นต้องมีการแก้ไขโค้ดหลัง


1
ฉันคิดว่าการมี CSS สำหรับฟิลด์ตัวแก้ไขคลาสและฟิลด์การแสดงผลที่นี่อาจมีประโยชน์มาก
DOK

คุณหมายถึงอะไรโดย"โซลูชันนี้ปิดใช้งานที่ยื่นต่อการแก้ไข" (ดูเหมือนจะไม่เข้าใจ) โปรดตอบกลับโดยแก้ไขคำตอบของคุณไม่ใช่ที่นี่ในความคิดเห็น (ตามความเหมาะสม)
Peter Mortensen

3

พร้อมเครดิตสำหรับคำตอบก่อนหน้าโดย @Bronek และ @Shimmy:

นี่เหมือนกับว่าฉันได้ทำสิ่งเดียวกันใน ASP.NET Core:

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

อินพุตแรกเป็นแบบอ่านอย่างเดียวและอินพุตที่สองส่งผ่านค่าไปยังคอนโทรลเลอร์และถูกซ่อนไว้ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับคนที่ทำงานกับ ASP.NET Core



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

ใช้ได้ดีสำหรับกล่องข้อความ อย่างไรก็ตามหากคุณพยายามทำเช่นเดียวกันให้checkboxลองใช้สิ่งนี้หากคุณกำลังใช้:

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

แต่อย่าใช้disableเพราะปิดใช้งานจะส่งค่าเริ่มต้นfalseไปยังเซิร์ฟเวอร์เสมอไม่ว่าจะอยู่ในสถานะที่เลือกหรือไม่เลือกก็ตาม และreadonlyไม่ทำงานสำหรับช่องทำเครื่องหมายและradio button. readonlyใช้ได้กับtextฟิลด์เท่านั้น


แล้วรายการแบบเลื่อนลงล่ะ?
user3020047

หวังว่านี่จะช่วยstackoverflow.com/questions/1636103/…
gdmanandamohon

0

คุณสามารถใช้โค้ดด้านล่างเพื่อสร้างกล่องข้อความเป็นแบบอ่านอย่างเดียว

วิธีที่ 1

 @Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })

วิธีที่ 2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.