ASP.NET MVC 3: แทนที่แอตทริบิวต์ "name" ด้วย TextBoxFor


100

เป็นไปได้ไหมเมื่อใช้Html.TextBoxForเพื่อแทนที่แอตทริบิวต์ name

ฉันพยายามแล้วไม่ประสบความสำเร็จ ฉันจำเป็นต้องใช้ TextBoxFor เพื่อให้การตรวจสอบฝั่งไคลเอ็นต์ทำงานได้อย่างไรก็ตามด้วยเหตุผลที่ฉันจะไม่เข้าไปฉันต้องการให้ชื่อของกล่องข้อความแตกต่างจากที่สร้างขึ้น

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

ซึ่งใช้ได้กับ ID แต่ไม่ใช่ชื่อ เป็นไปได้หรือไม่

อัปเดต : ค้นหารหัสสำหรับ TextBoxFor ดูเหมือนจะไม่มีวิธีง่ายๆ หวังว่าจะมีคนพิสูจน์ได้ว่าฉันผิด


ประเภทข้อมูลของ 'Data' คืออะไร
archil


2
คำถามเหล่านั้นกำลังถามบางสิ่งที่แตกต่างกันเล็กน้อย นอกจากนี้ - นี่เป็นรุ่นเก่าของทั้งสามคนดังนั้นฉันคิดว่าคุณหมายถึงการทำซ้ำโดย
Rob Stevenson-Leggett

คำตอบ:


236

Rob จริงๆแล้วมีวิธีที่ง่ายกว่านั้นมาก แทนที่จะชื่อใช้ชื่อ :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })

11
โดยคำนึงถึงตัวพิมพ์เล็กและใหญ่เป็น @highwingers รายละเอียดเล็ก ๆ นี้สามารถประหยัดเวลาได้
anar khalilov

3
Overkill .. ชื่อ แต่รหัส X_X
Vladimirs

2
แปลก "id" ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ (ใช้ได้ดีกับ Id และ id) แต่ไม่ใช่ "name"
Vladimirs

10
ด้วย ASP.NET 4 ให้Nameผลลัพธ์ในสองแอตทริบิวต์Nameและnameและตัวประสานแบบจำลองใช้name.
GSerg

1
แต่การจัดการคุณสมบัติที่แตกต่างกันสองอย่างที่มีชื่อแตกต่างกันไปตามแต่ละกรณีเป็นสูตรสำหรับฝันร้ายในการบำรุงรักษา .....
James McCormack

41

คุณถามสิ่งนี้เพราะคุณต้องการใช้คำนำหน้าชื่อหรือไม่? ในกรณีนี้คุณสามารถทำได้โดยการตั้งค่าViewData.TemplateInfo.HtmlFieldPrefixในคอนโทรลเลอร์ของคุณ

ผมได้เรียนรู้มากเกี่ยวกับสิ่งนี้จากบล็อกของแบรดวิลสัน


ดูเหมือนผู้ชนะ! สวย.
Rob Stevenson-Leggett

2
ใช่พวกเขาซ่อนสิ่งที่ไม่ดีไว้ :)
James McCormack

แค่นี้ก็ช่วยให้ฉันปวดหัวกับการทำรหัสซ้ำแล้ว
davidXYZ

13

EditorFor มีโอเวอร์โหลดที่คุณสามารถจัดหาnameแอตทริบิวต์เป็นพารามิเตอร์:

 @Html.EditorFor(expression, null, name)

1
จะช่วยฉันได้หลายชั่วโมงถ้าฉันพบเมื่อชั่วโมงก่อนนี้ฮ่าฮ่า
Johnie Karr

น่าสนใจ แต่ไม่มีการโอเวอร์โหลดสำหรับแอตทริบิวต์ name สำหรับตัวช่วยที่คล้ายกันเช่น DropDownListFor คุณต้องระบุในพารามิเตอร์แอตทริบิวต์ html (โดยมีตัวพิมพ์ใหญ่ N ในชื่อ)
nmit026

8

ลองEditorFor คุณสามารถส่งสตริงเป็นชื่อเทมเพลตได้หากคุณต้องการให้แน่ใจว่า textbox ถูกแสดงผลแม้ว่าประเภทคุณสมบัติจะไม่ใช่สตริงก็ตาม หากคุณสมบัติเป็นสตริงอยู่แล้วก็ไม่จำเป็นต้องtemplatenameแสดงผล textbox อย่างชัดเจนคุณจึงสามารถส่งผ่านnullได้ โปรดทราบว่าไม่ต้องการพารามิเตอร์ id อย่างชัดเจนมันจะอนุมานจากชื่อองค์ประกอบ และการตรวจสอบความถูกต้องทั้งหมดยังคงทำงานอยู่กับ EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")

7

คำตอบของเบ็นทำให้ฉันได้รับสิ่งที่ฉันกำลังมองหายกเว้นคุณต้องห่อเป็น Html.Raw

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))

4

เรียกว่า Microsoft GOTCHA

ใช้ชื่อในตัวพิมพ์ใหญ่เช่นนี้

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})

3

"ไม่สวย" =) ลอง:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

ดูเหมือนจะเป็นวิธีง่ายๆที่ดี หากแฮ็คเล็กน้อย :-)
Rob Stevenson-Leggett

อืมวิธีนี้คุณไม่อยากใช้ Html.TexBox ปกติ .. เนื่องจากการพิมพ์แบบคงที่จะหายไปหลังจากการแทนที่
sharp johnny

1

สำหรับฉันมันได้ผล! หวังว่าจะช่วยได้!

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })

1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

ไม่แน่ใจว่าพารามิเตอร์สตริงสองตัวใดที่อยู่ตรงกลางทำงานได้ดี แต่จะใช้ได้ก็ต่อเมื่อฉันพิมพ์ทั้งคู่


มันคือรหัสและชื่อ สิ่งนี้ได้ผลสำหรับฉัน ฉันได้รับคำตอบข้างต้นทั้งหมดและไม่ได้ผล แต่ 1. ขอบคุณ
Orion

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. ไม่มีความคิดในสิ่งที่ควรจะเป็นดังนั้นฉันใช้templateName nullสำหรับhtmlFieldNameฉันใช้ชื่อของพารามิเตอร์ (ในกรณีของฉันคือ "ipmi" แทน "IPMI") นั่นเป็นเคล็ดลับสำหรับฉัน
BCdotWEB

0

สำหรับตัวอย่างนี้ฉันกำลังปิดใช้งานช่องแบบฟอร์มตามสิทธิ์ แต่ยังคงแสดงอยู่ ฉันมีฟิลด์ที่ซ่อนไว้เพื่อส่งค่าไปยังคอนโทรลเลอร์ แต่ต้องการชื่อฟิลด์อื่นใน EditorFor พารามิเตอร์ตัวแรกหลังค่าโมเดลแสดงถึงคุณสมบัติ "name" ส่วนที่สองคือชื่อใหม่

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

ผลลัพธ์ใน:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 

0

พูดง่ายๆว่าคุณให้ ID อยู่แล้วคุณควรจะสามารถใช้เมธอด "TextBox" แทน "TextBoxFor" ได้และมันจะทำงานได้ดีทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ นอกจากนี้แม้ว่าคำตอบที่ยอมรับจะใช้ได้ แต่จะสร้างแอตทริบิวต์ชื่อที่ซ้ำกันบนแท็กของคุณหากคุณตรวจสอบโดยใช้เบราว์เซอร์ วิธีแก้ปัญหาด้านล่างไม่มีปัญหานั้น

MvcHtmlString Html.TextBox (ชื่อสตริงค่าสตริงวัตถุ htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.