2011-01-03 13 views
19

Jak używać niestandardowych elementów sterujących za pomocą maszynki ASPNET.MVC Razor?Niestandardowe elementy sterujące za pomocą programu ASP.NET MVC Razor

Chcę użyć niestandardowego sterowania w widoku maszynki. na przykład:

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

lub

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

Należy pamiętać, że moim celem jest wykorzystanie tylko kilka kontroli pochodzące z MvcControl, tylko dla błahych repetive spożywczych UI.

Próbowałem znaleźć składnię podobną do @Register, aby pisać na górze widoku, ale bez powodzenia.

Potem poszedłem do pliku web.config, dodając

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

ale wygląda na niestandardowe elementy sterujące są ignorowane w renderingu.

Ktoś może pomóc?

... Może to być trochę staromodne, ale czasami również niestandardowa kontrola może być przydatna, aby twój kod był czystszy!

+0

powtarzając opinie wszyscy inni tutaj, ale podejmiecie niewłaściwe podejście. Są lepsze sposoby robienia tego, co chcesz w Razorze, a nawet w ogóle w MVC. –

Odpowiedz

10

W ASP.NET MVC należy unikać niestandardowych kontroli serwera. Większość z nich polega na ViewState i PostBack, które są pojęciami, które już nie istnieją w MVC. Powinieneś preferować używanie szablonów, pomocników HTML do implementacji funkcji wielokrotnego użytku. Innym problemem z kontrolami jest większość z nich zawiera pewną logikę biznesową, która pobiera dane skądś i renderuje je, co jest wzorcem anty-MVC. W MVC obowiązkiem kontrolera jest manipulowanie modelem i pobieranie danych oraz przekazywanie modelu widoku do widoku, który powinien go wyświetlać.

+0

Wiem o tym, ale zamierzam użyć kontrolek wyprowadzonych z MvcControls, tylko dla trywialnych plików UI. – Fabrizio

+0

Co masz na myśli przez * MvcControls *? –

+0

Mam na myśli implementację kontrolek wywodzących się z klasy MvcControl w przestrzeni nazw Microsoft.Web.Mvc.Controls z zestawu MvcFutures. – Fabrizio

6

MVC korzysta z częściowym widokiem zamiast kontroli celnych i mogą być używane na dwa sposoby, które obejmują prawie wszystko kontrola zwyczaj może zrobić

  • renderPartial co czyni dane już pobrane przez kontroler widoku
  • RenderAction który jest podobny, ale ma swoje własne działania kontroler, dzięki czemu można uzyskać dane niezależnie

jedyny scenariusz mogę myśleć gdzie warto byłoby wprowadzenie niestandardowych formantów na zasadzie mvc widzenia jest, jeśli pracujesz na częściowo zmigrowany projekt formularzy internetowych i wątpię, aby działał z czymkolwiek innym niż WebFormsViewEngine.

19

Składnia maszynki Razor nie obsługuje w ogóle pojęcia Kontroli. Jeśli chcesz używać kontrolek, będziesz musiał użyć składni ASPX (WebForms).

Jednak zalecanym wzorcem MVC jest użycie funkcji helpera html lub widoków częściowych. W Razor możesz również użyć składni @helper dla szybkich funkcji pomocnika.

+0

Myślę, że ważne jest, aby zauważyć, że "składnia ASPX" może być myląca. Widziałem pytania osób pytających, jak używać kontrolek serwera w ASP.NET MVC za pomocą mechanizmu widoku ASPX. Ale tak, twoja odpowiedź jest poprawna! –

1

Możesz to zrobić, ale nie polecam, ale nie jestem tutaj, by oceniać. Mogę dodać, że nie oczekuję stanu odświeżenia i stanu widoku, aby kontynuować pracę, ale możesz przynajmniej renderować cały HTML.

Jedynym sposobem na zrobienie tego jest nieco hackowania, ponieważ maszynki do golenia nie obsługują mechanizmów sterowania widokami w trybie online. Obsługuje jednak widoki częściowe wykonane w mechanizmie widoków formularzy internetowych.Więc hacky rozwiązaniem jest to częściowy widok z kontrolą w nim jako takie:

Na przykład, że chcesz korzystać z Office Web UI wstążka w projekcie mvc3, można to zrobić poprzez włączenie

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

w Twoim widoku. Gdzie _Ribbon jest typu .aspx

następnie w częściowym widokiem prostu wykorzystać swoją kontrolę i ustawić runat = „server” i umieścić go wewnątrz formularza z 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> 

Następnie trzeba używać ajax do implementacji zdarzeń zamiast korzystania z funkcji odświeżania.

Następnie, aby oczyścić, pozbyć się wygenerowanego kodu z silnika widoku formularzy internetowych, aby nie było potrzeby wysyłania postów. Możesz spróbować go zachować, nie mam, więc nie jestem pewien, co się stanie. Wiem, że istnieją sposoby, aby mieć fałszywy stan wyświetlania, jak również, jeśli naprawdę chcesz, aby dostać się plączą hacky rzeczy, ale żeby usunąć dodatkowy kod z webforms można wykorzystać następujące jQuery:

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

Miałem ten sam popyt . Chciał używać niestandardowego webcontrola ze strony Razor/MVC. Nie należy tego robić z kontrolkami, czyli obsługą odświeżania. Nie ma eventcycle na poparcie, ale jeśli tylko popyt jest użycie „kontrolę” renderingu, możesz oznacz ją w maszynce i kontrolować, gdzie odbywa renderowania:

@{ 
    var myControl = new mycontrols.something(); 
    myControl.myattribute = Model.MyVar; 
    mycontrol.RenderControl(new HtmlTextWriter(this.Output)); 
} 
Powiązane problemy