2009-01-15 25 views
18

Một số văn bản trên trạng thái ASP.NET MVC rằng "không có thẻ máy chủ runat", ngay cả bài viết MSDN này, khi nào, ngay trên câu lệnh đó có một ví dụ mã với thẻ máy chủ runat trong phần tử HEAD:Trạng thái của thẻ runat = "server" trong ASP.NET MVC là gì?

Và cuộc nói chuyện StackOverflow tôi đọc

"thực tế là bạn muốn sử dụng "runat = server" kiểm soát có nghĩa là bạn nên làm một ứng dụng ASP.NET truyền thống.

Và tất nhiên trong trang Site.Master có thuộc tính máy chủ runat trong ContentPlaceHolders.

Điều duy nhất tôi thấy vắng mặt từ ASP.NET MVC về máy chủ runat là thẻ FORM runat = "server" phổ biến trên mỗi trang .aspx/xem.

Nhưng những gì về phần còn lại của thẻ máy chủ runat trong ASP.NET MVC, những gì mọi người có nghĩa là khi họ nói rằng ASP.NET MVC không có những?

Trả lời

7

Nếu bạn sử dụng thẻ runat = "server" trên bất kỳ phần tử nào, chẳng hạn như DIV, nó sẽ hiển thị mã đó dưới dạng phương thức riêng biệt trong trang được biên dịch.

Nếu bạn đang chuyển đổi mã 'kế thừa', bạn nên xóa tất cả các thẻ runat ngay trước mặt nếu không bạn sẽ gặp phải tình huống mã như sau cho bạn lỗi.

<% foreach (var cat in cats) { %> 
    <div runat="server"> 
     <span class="name"> <%= cat.name %> </span> is a 
     <span class="breed"> <%= cat.breed %> </span> 
    </div> 
<% } %> 

Mã này sẽ không cho bạn biết một chút điên rồ về 'cat' nằm ngoài phạm vi. Cuối cùng, khi bạn nhìn vào mã được tạo đầy đủ, bạn sẽ thấy rằng <div> đã được tạo ra như là phương pháp riêng của nó - tất nhiên là phạm vi khác nhau không có con mèo trong tầm nhìn.

Trở lại trong giây lát để template mặc định cho một ứng dụng MVC:

Bạn sẽ thấy các mẫu hiện tại mang đến cho bạn này cho head:

<head runat="server"> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
    <title><%= Html.Encode(ViewData["Title"]) %></title> 
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
</head> 

này để lại cho tôi tự hỏi - nếu chúng ta đang sử dụng <% = cú pháp để viết tiêu đề trực tiếp vào thẻ title - vậy tại sao chúng ta cần phải làm cho nó runat?

Hóa ra là tôi nghi ngờ rằng codebehind cho head tìm một giá trị hiện có bên trong thẻ tiêu đề (có thể đã được xuất tại đây <%= Html.Encode(ViewData["Title"]) %>. Nếu nó tìm thấy (sẽ là trường hợp cho tất cả các lượt xem mẫu trong Nếu không có tiêu đề nào tồn tại (nếu ViewData ["Title"] là null hoặc rỗng), nó sẽ mặc định cho bất cứ điều gì được xác định trong khung nhìn của bạn theo thuộc tính Title:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/RRMaster.Master" 
Title="View Products" AutoEventWireup="true" CodeBehind="ViewProduct.aspx.cs" 
Inherits="RR_MVC.Views.Products.ViewProduct" %> 

Trong trang cái của tôi, tôi đã xóa thẻ runat='server' - vì tôi không nghĩ rằng mình sẽ muốn đặt tiêu đề trang của mình từ chế độ xem Title tài sản. Nhưng tôi đang cố gắng thực hiện bài đăng blog hứa hẹn này của Phil về chủ đề - trong trường hợp máy chủ runat cung cấp cho tôi bất kỳ điều gì hữu ích cho CSS và JS của tôi nữa.

2

Chúng không có nghĩa là bạn không thể sử dụng runat = "server", mà đúng hơn là không cần sử dụng các điều khiển phía máy chủ, nói chung, trong MVC. Nếu bạn thấy rằng bạn cần một điều khiển phía máy chủ và đang làm việc với nó trong mã-đằng sau đó là và chỉ ra rằng ứng dụng đang có xu hướng trở lại đối với các biểu mẫu web. Tất cả những thứ thường xảy ra trong shoulo code-behind của bạn bây giờ được xử lý trong bộ điều khiển của bạn hoặc trong chính logic xem.

+0

Hmm, vậy tại sao khi tôi tạo Trang chủ Chế độ xem MVC mặc định, nó có ba máy chủ lưu trữ không? Dường như nếu đây không phải là các cấu trúc MVC điển hình thì ít nhất các giá trị mặc định của mã sẽ không có chúng. –

+1

Nó vẫn đang sử dụng công cụ hiển thị ASP và ContentPlaceHolders là cách bạn tạo các trang cái trong ASP.NET. Lưu ý rằng điều quan trọng là "nếu bạn thấy mình làm việc với nó trong code-behind" - các trình giữ chỗ trong MVC không được giải quyết trong đoạn mã phía sau. – tvanfosson

1

Chỉ cần đọc trong hướng dẫn này:

http://www.asp.net/learn/mvc/tutorial-12-cs.aspx

mà bạn cần

<head runat="server"> 

để có thể dễ dàng xác định các tiêu đề trang trong quan điểm của bạn.

+0

Không, bạn không có. Bạn có thể sử dụng ViewData hoặc sử dụng MasterPages với một trình giữ chỗ nội dung. –

+0

Phải, ý tôi là "tự động". Phải, bạn có thể tiếp nhận và tự mình làm điều đó. –

+2

Không, head runat = "server" (còn gọi là HeaderControl) giúp dễ dàng tham chiếu các tệp .css và .js trong phần đầu. Nó sẽ viết lại giá trị Href. Tôi nghĩ rằng tôi sẽ viết một bài đăng trên blog về điều này. – Haacked

1

MVC chỉ là một lớp ở trên cùng của biểu mẫu web. Điều khiển biểu mẫu web tùy chỉnh của tôi cũng yêu cầu thẻ head có thể truy cập được vào máy chủ để đăng ký tập lệnh. Các điều khiển tùy chỉnh này được hiển thị và không sử dụng các sự kiện của ViewState hoặc serverside. Bởi vì điều này họ cũng có thể được sử dụng trong MVC với công cụ xem ASPX.

Các vấn đề liên quan