Html.HiddenFor làm gì?


105

Mặc dù tôi đã đọc tài liệu về Html.HiddenFor, tôi vẫn chưa hiểu nó được sử dụng để làm gì ...

Ai đó có thể giải thích công dụng của nó và đưa ra một ví dụ ngắn gọn không?

Những người trợ giúp đó nên đi đâu trong mã?

Câu trả lời:


112

Nó tạo một đầu vào ẩn trên biểu mẫu cho trường (từ mô hình của bạn) mà bạn chuyển nó.

Nó hữu ích cho các trường trong Model / ViewModel của bạn mà bạn cần phải duy trì trên trang và đã trả lại khi một lệnh gọi khác được thực hiện nhưng người dùng không nên nhìn thấy.

Hãy xem xét lớp ViewModel sau:

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

Bây giờ bạn muốn trang chỉnh sửa lưu trữ ID nhưng không thấy nó:

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

Điều này dẫn đến tương đương với HTML sau:

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

<% = Html.HiddenFor (model.Id)%> <br /> trong ví dụ của anh ấy ở trên
Bryce Fischer

11
Tôi sẽ nói "đã thấy" bởi người dùng. Người dùng có thể "sửa đổi" bất cứ điều gì họ muốn, ẩn hoặc không.
Craig Stuntz

@Craig - Bạn nói đúng. Tôi thực sự mặc dù tôi đã thay đổi từ ngữ đó nhưng dường như không.
Justin Niessner

Và nó thường được sử dụng cho ID (như trong ví dụ trên), mà bạn thường không muốn hiển thị.
RickAndMSFT

Tôi hơi bối rối vì mô hình chế độ xem không phải là tham số của bộ điều khiển. Vậy tại sao tên của đầu vào lại được tạo trên các trường của mô hình khung nhìn?
John

8

Và để sử dụng lại đầu vào ID ẩn trên phương pháp hành động Chỉnh sửa của bạn:

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

8
Mặc dù điều này đúng về mặt kỹ thuật, bạn không cần phải làm điều này nếu biểu mẫu được nhập mạnh vào một mô hình chế độ xem. Bạn sẽ có thể truy cập trực tiếp vào mô hình, điều này giúp bạn không cần phải thực hiện bất kỳ chuyển đổi nào.
Yetti

@Yetti: Không chính xác. Có một lý do chính đáng để cơ chế giàn giáo thêm trường ID. Xóa nó khỏi một trong các hướng dẫn của tôi và sử dụng Fiddler để xem nó không có trong nội dung bài đăng.
RickAndMSFT

2
Tôi không chắc làm thế nào nhận xét là không chính xác. Nếu Model là thuộc tính For () 'd trong dạng xem, phương thức controller phải được gõ mạnh và được ModelBinder tự động điền.
Erik Philips

2

Giống như rất nhiều chức năng, chức năng này có thể được sử dụng theo nhiều cách khác nhau để giải quyết nhiều vấn đề khác nhau, tôi coi nó như một công cụ khác trong thanh công cụ của chúng tôi.

Cho đến nay, cuộc thảo luận tập trung nhiều vào việc đơn giản là ẩn một ID, nhưng đó chỉ là một giá trị, tại sao không sử dụng nó cho rất nhiều giá trị! Đó là những gì tôi đang làm, tôi sử dụng nó để tải các giá trị trong một lớp chỉ một chế độ xem tại một thời điểm, bởi vì html.beginform tạo ra một đối tượng mới và nếu đối tượng mô hình của bạn cho chế độ xem đó đã có một số giá trị được chuyển cho nó, thì các giá trị sẽ bị mất trừ khi bạn cung cấp tham chiếu đến các giá trị đó trong biểu mẫu bắt đầu.

Để thấy động lực tuyệt vời cho html.hiisedfor, tôi khuyên bạn nên xem Truyền dữ liệu từ Chế độ xem sang Bộ điều khiển trong .NET MVC - "@model" không đánh dấu


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.