ASP.NET MVC 3: Ghi đè thuộc tính "name" bằng TextBoxFor


99

Có thể khi sử dụng Html.TextBoxForđể ghi đè thuộc tính tên không?

Tôi đã cố gắng nhưng không thành công. Tôi cần sử dụng TextBoxFor để xác thực phía máy khách hoạt động, tuy nhiên vì lý do tôi sẽ không đi vào, tôi cần tên của hộp văn bản khác với tên được tạo.

Tôi đã thử những cách sau:

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

Mà hoạt động cho ID nhưng không phải tên. Điều này có khả thi không?

Cập nhật : Tìm kiếm mã cho TextBoxFor. Có vẻ như không có một cách dễ dàng. Hy vọng rằng ai đó có thể chứng minh tôi sai.


Kiểu dữ liệu của 'Dữ liệu' là gì
archil


2
Những câu hỏi đó đang hỏi một cái gì đó hơi khác. Ngoài ra - đây là cái cũ hơn trong ba cái, vì vậy tôi nghĩ bạn có nghĩa là sao chép bởi.
Rob Stevenson-Leggett

Câu trả lời:


234

Rob, thực ra có một cách đơn giản hơn nhiều. Thay vì tên , hãy sử dụng Tên :

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

11
Phân biệt chữ hoa chữ thường, nó là @highwingers, chi tiết nhỏ này có khả năng tiết kiệm hàng giờ đồng hồ.
anar khalilov

3
Quá mức cần thiết .. Tên nhưng có id X_X
Vladimirs

2
Kỳ lạ, "id" không phân biệt chữ hoa chữ thường (hoạt động tốt với Id và id) nhưng "name" thì không.
Vladimirs

10
Với ASP.NET 4, việc cung cấp Namekết quả trong hai thuộc tính Namename, và chất kết dính mô hình sử dụng name.
GSerg

1
Nhưng việc xử lý hai thuộc tính khác nhau có tên chỉ khác nhau theo từng trường hợp là một công thức cho một cơn ác mộng bảo trì .....
James McCormack

41

Bạn hỏi điều này vì bạn muốn áp dụng một tiền tố cho tên? Nếu vậy, bạn có thể thực hiện việc này bằng cách thiết lập ViewData.TemplateInfo.HtmlFieldPrefixtrong Bộ điều khiển của mình.

Tôi đã học được rất nhiều điều về điều này từ blog của Brad Wilson .


Đây có vẻ như là người chiến thắng! Xinh đẹp.
Rob Stevenson-Leggett

2
Vâng, họ đã giấu cái đó một cách độc đáo phải không :)
James McCormack

Điều này chỉ giúp tôi đỡ đau đầu và trùng lặp mã.
davidXYZ

13

EditorFor có quá tải nơi bạn có thể cung cấp namethuộc tính dưới dạng tham số:

 @Html.EditorFor(expression, null, name)

1
Sẽ tiết kiệm cho tôi hàng giờ nếu tôi tìm thấy giờ này trước đây, haha
Johnie Karr

Thật thú vị, nhưng không có quá tải đối với thuộc tính name cho các trình trợ giúp tương tự như DropDownListFor, bạn phải chỉ định nó trong tham số thuộc tính html (với N viết hoa trong Tên).
nmit026

8

Hãy thử EditorFor . bạn có thể chuyển chuỗi làm tên mẫu nếu bạn muốn đảm bảo hộp văn bản được hiển thị ngay cả khi loại thuộc tính không phải là chuỗi. Nếu thuộc tính đã là chuỗi, nó không cần templatenamehiển thị hộp văn bản một cách rõ ràng, vì vậy bạn có thể chuyển null. Lưu ý rằng nó không yêu cầu tham số id một cách rõ ràng, nó sẽ suy ra nó từ tên phần tử. Và tất cả những thứ xác thực vẫn đang hoạt động với EditorFor

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

7

câu trả lời của ben đã cho tôi những gì tôi đang tìm kiếm ngoại trừ bạn cần phải hoàn thành trong Html.

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

4

Nó được gọi là Microsoft GOTCHA

Sử dụng tên viết hoa, như thế này

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

3

một chút "không khéo léo" =), hãy thử:

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

Có vẻ như một cách dễ dàng để làm điều đó. Nếu một chút hacky :-)
Rob Stevenson-Leggett

umm, theo cách này, bạn không muốn chỉ lấy Html.TexBox bình thường .. vì mọi thao tác nhập tĩnh đều biến mất sau khi thay thế
sharp johnny

1

Đối với tôi, nó hoạt động! Tôi hy vọng rằng sự giúp đỡ!

@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" })

Không chắc chắn tham số chuỗi nào ở giữa hoạt động hiệu quả, nhưng nó chỉ hoạt động khi tôi nhập cả hai tham số đó.


Đó là Id và Tên. điều này đã làm việc cho tôi. Tôi đã xem qua tất cả các câu trả lời ở trên và không phải trong số chúng hoạt động, nhưng điều này 1. Cảm ơn.
Orion

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Không có ý tưởng gì templateNameđược cho là, vì vậy tôi đã sử dụng null. Đối với htmlFieldNametôi đã sử dụng tên của tham số (trong trường hợp của tôi là "ipmi" thay vì "IPMI"). Điều đó đã đánh lừa tôi.
BCdotWEB

0

Đối với ví dụ này, tôi đã tắt các trường biểu mẫu dựa trên quyền, nhưng vẫn hiển thị chúng. Tôi có một trường ẩn để gửi giá trị đến bộ điều khiển, nhưng muốn một tên trường khác trong EditorFor. Tham số đầu tiên sau giá trị mô hình đại diện cho thuộc tính "name", thứ hai là tên mới.

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

Kết quả trong:

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

0

Hãy đơn giản, bạn đã cung cấp ID, bạn sẽ có thể sử dụng phương thức "TextBox" thay vì "TextBoxFor" và nó sẽ hoạt động tốt ở phía máy khách và phía máy chủ. Ngoài ra, mặc dù câu trả lời được chấp nhận sẽ hoạt động nhưng sẽ tạo ra các thuộc tính Tên trùng lặp trên thẻ của bạn nếu bạn kiểm tra thẻ bằng trình duyệt. Giải pháp dưới đây không có vấn đề đó.

MvcHtmlString Html.TextBox (tên chuỗi, giá trị chuỗi, đối tượng htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.