2011-01-03 48 views
19

Làm cách nào để sử dụng các điều khiển tùy chỉnh với ASPNET.MVC Razor?Điều khiển tùy chỉnh với ASP.NET MVC Razor

Tôi muốn sử dụng điều khiển tùy chỉnh trên chế độ xem Dao cạo. ví dụ:

<mycontrols:something>@Model.MyVar</mycontrols:something> 

hoặc

<mycontrols:something myattribute="@Model.MyVar" /> 

Xin lưu ý rằng mục tiêu của tôi là để chỉ sử dụng vài điều khiển có nguồn gốc từ MvcControl, chỉ cho chất liệu ui repetive tầm thường.

Tôi đã cố gắng tìm ra cú pháp tương tự như @Register để viết ở đầu chế độ xem nhưng không thành công.

Sau đó, tôi đã đi đến web.config, thêm

<pages> 
    <controls> 
     <add tagPrefix="mycontrols" namespace="mynamespace" assembly="myassembly"/> 
    </controls> 
</pages> 

nhưng có vẻ như điều khiển tùy chỉnh được bỏ qua trong rendering.

Ai đó có thể trợ giúp?

... Có thể đó là một chút thời trang cũ, nhưng đôi khi cũng kiểm soát tùy chỉnh có thể hữu ích để làm cho mã của bạn sạch hơn!

+0

Đưa ra ý kiến mọi người khác ở đây, nhưng bạn đang sử dụng phương pháp sai. Có những cách tốt hơn để làm những gì bạn muốn trong Razor, và thực sự, MVC nói chung. –

Trả lời

10

Trong điều khiển máy chủ tùy chỉnh ASP.NET MVC nên tránh. Hầu hết trong số họ dựa vào ViewState và PostBack là các khái niệm không còn tồn tại trong MVC nữa. Bạn nên sử dụng các mẫu, trình trợ giúp HTML để triển khai một số chức năng có thể sử dụng lại. Một vấn đề khác với các điều khiển là hầu hết trong số chúng đóng gói một số logic nghiệp vụ lấy dữ liệu từ một nơi nào đó và làm cho nó là một mẫu chống MVC. Trong MVC, nó là trách nhiệm của bộ điều khiển để thao tác mô hình và tìm nạp dữ liệu và chuyển một mô hình khung nhìn đến khung nhìn đơn giản sẽ hiển thị nó.

+0

Tôi biết điều đó, nhưng tôi sẽ sử dụng các điều khiển có nguồn gốc từ MvcControls, chỉ dành cho các chất liệu ui tầm thường. – Fabrizio

+0

Bạn có ý nghĩa gì với * MvcControls *? –

+0

Tôi có nghĩa là để thực hiện điều khiển có nguồn gốc từ lớp MvcControl trong không gian tên Microsoft.Web.Mvc.Controls từ MvcFutures lắp ráp. – Fabrizio

6

MVC sử dụng quang cảnh một phần chứ không phải điều khiển tùy chỉnh, và chúng có thể được sử dụng trong hai cách mà trang trải khá nhiều tất cả mọi thứ một điều khiển tùy chỉnh có thể làm

  • renderPartial mà làm cho dữ liệu đã được lấy ra bởi bộ điều khiển trang
  • RenderAction tương tự nhưng có hành động điều khiển riêng của nó để có thể nhận dữ liệu độc lập

Kịch bản duy nhất tôi có thể nghĩ nơi cần đặt điều khiển tùy chỉnh trên chế độ xem mvc là nếu bạn đang làm việc một dự án webforms di chuyển một phần, và tôi nghi ngờ rằng sẽ làm việc với bất cứ điều gì khác hơn là WebFormsViewEngine.

19

Cú pháp dao cạo không hỗ trợ khái niệm Điều khiển. Nếu bạn muốn sử dụng các điều khiển, bạn sẽ phải sử dụng cú pháp ASPX (WebForms).

Tuy nhiên, mẫu MVC được khuyên dùng là sử dụng chức năng trợ giúp html hoặc chế độ xem một phần. Trong Razor, bạn cũng có thể sử dụng cú pháp @helper cho các hàm trợ giúp nhanh.

+0

Tôi nghĩ rằng điều quan trọng cần lưu ý là "cú pháp ASPX" có thể gây hiểu nhầm ở đây. Tôi đã nhìn thấy câu hỏi của những người hỏi làm thế nào để sử dụng điều khiển máy chủ trên ASP.NET MVC bằng cách sử dụng công cụ xem ASPX. Nhưng có, câu trả lời của bạn là chính xác! –

1

Bạn có thể làm điều này, mặc dù tôi không khuyên bạn nên, mặc dù tôi không ở đây để phán xét. Tôi có thể thêm rằng tôi không mong đợi postback và xem nhà nước để tiếp tục làm việc, nhưng bạn có thể ít nhất là làm cho tất cả các html.

Cách duy nhất để thực hiện việc này là một chút hack, bởi vì dao cạo không hỗ trợ điều khiển công cụ xem webforms. Tuy nhiên, nó hỗ trợ một phần lượt xem được thực hiện trong biểu mẫu web Xem công cụ.Vì vậy, một giải pháp hacky là bao gồm một cái nhìn cục bộ với kiểm soát của bạn trong nó như vậy:

Ví dụ, nói rằng bạn muốn sử dụng các trang web văn phòng ui ribbon trong dự án MVC3 của bạn, bạn có thể làm như vậy bằng cách bao gồm

<body> 
    <div> 
     @Html.Partial("_RibbonPartial") 
    </div> 
</body> 

trong chế độ xem của bạn. Nơi _Ribbon là loại .aspx

sau đó theo quan điểm của một phần của bạn chỉ cần sử dụng kiểm soát của bạn và thiết lập runat = "server" và đặt nó bên trong một hình thức với runat = "server"

//_Ribbon.aspx 
<form id="form1" runat="server"> 
    <XyzControls:Manager ID="Manager1" runat="server" UITheme="Silver" /> 
    <XyzControls:OfficeRibbon ID="OfficeRibbon1" runat="server" ApplicationMenuColor="#267c29" 
     ApplicationMenuText="Item" ApplicationMenuType="Backstage"> 
//... rest of control code 
</form> 

Sau đó, bạn cần sử dụng ajax để triển khai các sự kiện thay vì sử dụng postback.

Sau đó, để dọn dẹp, loại bỏ mã được tạo ra từ công cụ xem webforms để đăng lại mà bạn không cần .. Bạn có thể thử giữ nó, tôi đã không vì vậy tôi không chắc chắn những gì sẽ xảy ra. Tôi biết có nhiều cách để có một ViewState giả cũng như nếu bạn thực sự muốn nhận được vào thứ hacky lộn xộn, nhưng để loại bỏ các mã thêm từ webforms bạn có thể sử dụng jquery sau:

$(function() 
{ 
    // we don't need any of the webforms stuff 
    $("#__EVENTTARGET","#aspnetForm").parents("div:first").remove(); 
    $("#__EVENTVALIDATION","#aspnetForm").parents("div:first").remove(); 
}); 
1

tôi có nhu cầu tương tự . Muốn sử dụng tùy chỉnh webcontrol từ trang Razor/MVC. Người ta không nên làm điều đó với các điều khiển, đó là xử lý postback. Bạn không có eventcycle để hỗ trợ điều đó, nhưng nếu nhu cầu duy nhất của bạn là sử dụng 'điều khiển hiển thị', bạn có thể khởi tạo nó trong dao cạo và kiểm soát nơi hiển thị diễn ra:

@{ 
    var myControl = new mycontrols.something(); 
    myControl.myattribute = Model.MyVar; 
    mycontrol.RenderControl(new HtmlTextWriter(this.Output)); 
} 
Các vấn đề liên quan