Làm cách nào để thay đổi tên hiển thị cho LabelFor trong dao cạo trong mvc3?


87

Trong công cụ dao cạo, tôi đã sử dụng LabelForphương thức trợ giúp để hiển thị tên

Nhưng tên hiển thị có vẻ không tốt để hiển thị. vì vậy tôi cần phải thay đổi tên hiển thị của mình.

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 

Đây là một câu hỏi rất cũ, nhưng vẫn rất phù hợp với mã hóa MVC hiện tại. Có vấn đề với hai giải pháp được cung cấp cho đến nay, vì vậy tôi đã thêm một câu trả lời chi tiết hơn bao gồm cả 3 tùy chọn có sẵn cho bạn.
Gone Coding vào

Câu trả lời:


160

Bạn có thể trang trí [DisplayName]thuộc tính mô hình chế độ xem của mình bằng thuộc tính và chỉ định văn bản sẽ được sử dụng:

[DisplayName("foo bar")]
public string SomekingStatus { get; set; }

Hoặc sử dụng quá tải khác của trình trợ giúp LabelFor cho phép bạn chỉ định văn bản:

@Html.LabelFor(model => model.SomekingStatus, "foo bar")

Và, không, bạn không thể chỉ định tên lớp trong MVC3 như bạn đã cố gắng thực hiện, vì trình LabelFortrợ giúp không hỗ trợ điều đó. Tuy nhiên, điều này sẽ hoạt động trong MVC4 hoặc 5.


@ raj2sekar1, nếu nó đang hoạt động và câu trả lời này đã giúp bạn giải quyết vấn đề bạn đang gặp phải, bạn nên xem xét đánh dấu nó là câu trả lời bằng cách nhấp vào dấu tích bên cạnh nó: meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
Tuy nhiên, bạn cần sử dụng System.ComponentModel.
yancyn

2
Điều này rất hữu ích, cảm ơn bạn. Nhưng tôi nghĩ rằng câu trả lời của bạn sẽ là tốt hơn nếu bạn có này để thay thế@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Có lẽ điều này đã được viết cách đây một lúc, nhưng bây giờ bạn có thể chỉ định tên lớp bên trong LabelFor: ví dụ: @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Nhưng nếu bạn cập nhật cơ sở dữ liệu, các lớp mô hình được tạo lại và bạn mất điều này. Làm thế nào để bạn tránh điều đó?
shim

30

Đây là một câu hỏi cũ, nhưng các câu trả lời hiện có bỏ qua vấn đề nghiêm trọng là loại bỏ bất kỳ thuộc tính tùy chỉnh nào khi bạn tạo lại mô hình. Tôi đang thêm một câu trả lời chi tiết hơn để bao gồm các tùy chọn hiện tại có sẵn.

Bạn có 3 lựa chọn:

  • Thêm một [DisplayName("Name goes here")]thuộc tính vào lớp mô hình dữ liệu. Nhược điểm là điều này sẽ bị loại bỏ bất cứ khi nào bạn tạo lại các mô hình dữ liệu.
  • Thêm một tham số chuỗi vào của bạn Html.LabelFor. ví dụ: @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Tham khảo: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx Nhược điểm của điều này là bạn phải lặp lại nhãn ở mọi góc nhìn.
  • Tùy chọn thứ ba. Sử dụng một lớp siêu dữ liệu được đính kèm với lớp dữ liệu (chi tiết sau).

Tùy chọn 3 - Thêm một lớp siêu dữ liệu:

Microsoft cho phép trang trí các thuộc tính trên một lớp Entity Framework mà không cần sửa đổi lớp hiện có ! Điều này bằng cách có các lớp siêu dữ liệu gắn vào các lớp cơ sở dữ liệu của bạn (thực sự là một phần mở rộng sang một bên của lớp EF của bạn). Điều này cho phép các thuộc tính được thêm vào lớp được liên kết chứ không phải vào chính lớp để các thay đổi không bị mất khi bạn tạo lại mô hình dữ liệu .

Ví dụ: nếu lớp dữ liệu của bạn MyModelcó thuộc SomekingStatustính, bạn có thể làm như sau:

Đầu tiên hãy khai báo một phần lớp có cùng tên (và sử dụng cùng một không gian tên), cho phép bạn thêm một thuộc tính lớp mà không bị ghi đè:

[MetadataType(typeof(MyModelMetaData))]
public partial class MyModel
{
}

Tất cả các lớp mô hình dữ liệu được tạo đều là các lớp một phần, cho phép bạn thêm các thuộc tính và phương thức bổ sung bằng cách tạo thêm các lớp cùng tên (điều này rất tiện dụng và tôi thường sử dụng nó, ví dụ: để cung cấp các phiên bản chuỗi được định dạng của các loại trường khác trong mô hình ).

Bước 2: thêm một lớp siêu dữ liệu được tham chiếu bởi lớp một phần mới của bạn:

public class MyModelMetaData
{
    // Apply DisplayNameAttribute (or any other attributes)
    [DisplayName("My New Label")]
    public string SomekingStatus;
}

Tham khảo: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

Ghi chú:

  • Từ bộ nhớ, nếu bạn bắt đầu sử dụng một lớp siêu dữ liệu, nó có thể bỏ qua các thuộc tính hiện có trên lớp thực tế ( [required]v.v.), vì vậy bạn có thể cần phải sao chép các thuộc tính đó trong lớp Siêu dữ liệu.
  • Điều này không hoạt động bằng phép thuật và sẽ không chỉ hoạt động với bất kỳ lớp nào. Mã tìm kiếm các thuộc tính trang trí giao diện người dùng được thiết kế để tìm kiếm một lớp siêu dữ liệu trước tiên.

Có lý do gì khiến điều này không hoạt động trong ASP.NET Core 3.1 không? [Bắt buộc] hoạt động, nhưng không hoạt động [DisplayName ("nhãn của tôi")]
John Pasquet

15

Bạn có thể thay đổi văn bản của nhãn bằng cách tô điểm DisplayNamethuộc tính bằng thuộc tính.

[DisplayName("Someking Status")]
public string SomekingStatus { get; set; }

Hoặc, bạn có thể viết HTML thô một cách rõ ràng:

<label for="SomekingStatus" class="control-label">Someking Status</label>

1
@shim: Bạn không thực sự nên làm việc trực tiếp với các lớp mô hình cơ sở dữ liệu / miền trong chế độ xem của mình, thông thường sẽ có một lớp 'mô hình chế độ xem' trung gian ở giữa.
Vman

chính xác những gì tôi đang tìm kiếm bằng cách sử dụng cú pháp nhãn..Cảm ơn @xander
Asif Iqbal

1
Vấn đề với "viết HTML thô một cách rõ ràng" là bạn sẽ phải tự viết nhãn mỗi khi sử dụng biểu mẫu đó. Sẽ tốt hơn nếu khai báo de DisplayName trên mô hình.
César León

4

Trang trí thuộc tính mô hình bằng thuộc tính DisplayName.


1

@ Html.LabelFor (model => model.SomekingStatus, "foo bar")

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.