Próbowałem utworzyć deklaratywnego pomocnika Razor w moim folderze App_Code dla projektu MVC 3 RTM.
Problem polegał na tym, że rozszerzenia MVC HtmlHelper, takie jak ActionLink, nie są dostępne. Dzieje się tak, ponieważ skompilowane elementy pomocnicze wywodzą się z właściwości System.Web.WebPages.HelperPage
i chociaż ujawniają ją Html
, to System.Web.WebPages.HtmlHelper
raczej jej typ niż System.Web.Mvc.HtmlHelper
.
Przykład rodzaju błędu, który otrzymuję, to:
„System.Web.Mvc.HtmlHelper” nie zawiera definicji „ActionLink” i nie można znaleźć metody rozszerzenia „ActionLink” akceptującej pierwszy argument typu „System.Web.Mvc.HtmlHelper” (czy brakuje dyrektywy using lub odniesienie do zespołu?)
Moim jedynym rozwiązaniem było utworzenie własnej strony HelperPage i zastąpienie właściwości Html:
using System.Web.WebPages;
public class HelperPage : System.Web.WebPages.HelperPage
{
// Workaround - exposes the MVC HtmlHelper instead of the normal helper
public static new HtmlHelper Html
{
get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
}
}
Następnie na górze każdego pomocnika muszę napisać:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
Czy to ma być takie trudne w MVC 3, czy robię coś źle?
źródło
Odpowiedzi:
Spójrz na
Marcind
odpowiedź na to pytanie. To, czego doświadczasz, to ograniczenie dotyczące umieszczania deklaratywnych widoków wApp_Code
folderze.źródło
Stworzyłem metodę rozszerzającą dla pomocnika WebPages, aby uzyskać dostęp do pomocnika strony.
źródło
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
i@using System.Web.Mvc.Html
do pliku pomocników cshtml wewnątrz App_CodeHtmlHelper
klasy tylko do celów kodowania, znalazłem jeszcze szybszy sposób, aby to zrobić, poprzez klasę statyczną,Microsoft.Security.Application.Encoder
jak w:Encoder.HtmlAttributeEncode(value)
Omar ma tutaj właściwą odpowiedź, ale chciałem coś dodać (nie krępuj się zaznaczyć odpowiedzi Omara jako odpowiedzi).
Byliśmy tego świadomi w wersji 1 i nie byliśmy w stanie uzyskać doskonałej poprawki w produkcie, ale David Ebbo (architekt w zespole ASP.Net) opublikował próbkę generatora kodu Visual Studio, który jest w zasadzie pierwszą eksploracją rodzaje pomysłów, których szukamy, aby to działało poprawnie: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx
Wypróbuj to i zobacz, co myślisz! Poinformuj Davida, jeśli masz komentarze, pisząc na jego blogu.
źródło
Podobne do @Jakes answer:
Stosowanie:
Źródło: Dino Esposito - Programowanie Microsoft ASP.NET MVC
źródło
Alternatywne rozwiązanie:
Dodaj to na górze pliku pomocnika maszynki do golenia:
to nazwij to tak:
źródło
Moje podejście do tego polega po prostu na przekazaniu strony jako parametru do metody pomocniczej. W twoim przykładzie wyglądałoby to tak:
Następnie w widoku Razor, gdzie jest to potrzebne, nazwij to w ten sposób:
Dzięki temu natychmiast uzyskasz dostęp do właściwości strony, takich jak
Html
lubUrl
które zwykle posiadasz (a przez toHtmlHelper
rozszerzenia).Dodatkową korzyścią (jeśli tego potrzebujesz) jest dostęp do właściwości instancji, takich jak strona
ViewData
.źródło
Z korzyścią dla wyszukiwarek wystąpił ten sam błąd podczas tworzenia widoków MVC jako części biblioteki klas (do ponownego wykorzystania komponentów). Rozwiązaniem, do którego częściowo nawiązano powyżej, było dodanie następujących instrukcji using na początku pliku .cshtml:
Żadna dodatkowa praca nie jest konieczna.
źródło
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
unoszę się w powietrzu@using System.Web.Mvc
. Jakieś pomysły?Wiem, że istnieją pewne problemy z inteligencją w MVC 3. Myślę, że pomocnicy będą nadal działać, jeśli masz przestrzeń nazw ustawioną w web.config.
MVC 3 RTM właśnie został wydany, czy używasz tego, czy wersji beta?
źródło
Wygląda na to, że ASP.NET MVC rozwiązało ten problem w VS 2013. Zobacz ten post http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- htmlhelper-ht
źródło
@using System.Web.Mvc.Html
na górze pliku cshtml w App_Code, ale pisząc @Html .... nie ujawnia żadnej z metod rozszerzających, takich jakEditorFor
. To absurdalne, że to nie działa po 2 głównych wydaniach i postach na blogu, które twierdzą, że zostało zaimplementowane. To nie jest. W rzeczywistości metody rozszerzające nie mogą działać, ponieważ są one przeznaczone dla klasy System.Web.Mvc.HtmlHelper, a nie klasy System.Web.WebPages.HtmlHelper, która jest udostępniana przez klasę System.Web.WebPages.HelperPage.