Saya mencoba membuat pembantu deklaratif Razor di folder App_Code saya untuk proyek MVC 3 RTM.
Masalah yang saya hadapi adalah ekstensi MVC HtmlHelper, seperti ActionLink, tidak tersedia. Hal ini karena pembantu yang dikompilasi berasal dari System.Web.WebPages.HelperPage
, dan meskipun Html
properti mengekspos sebuah properti, tetapi tipenya System.Web.WebPages.HtmlHelper
bukan System.Web.Mvc.HtmlHelper
.
Contoh dari jenis kesalahan yang saya dapatkan adalah:
'System.Web.Mvc.HtmlHelper' tidak berisi definisi untuk 'ActionLink' dan tidak ada metode ekstensi 'ActionLink' yang menerima argumen pertama jenis 'System.Web.Mvc.HtmlHelper' dapat ditemukan (apakah Anda kehilangan petunjuk penggunaan atau referensi perakitan?)
Satu-satunya solusi saya adalah membuat HelperPage saya sendiri dan mengganti properti 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; }
}
}
Saya kemudian harus menulis yang berikut ini di bagian atas setiap helper:
@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html
@helper DoSomething()
{
@Html.ActionLink("Index", "Home")
}
Apakah itu dimaksudkan untuk sekeras ini di MVC 3, atau apakah saya melakukan sesuatu yang salah?
sumber
Jawaban:
Lihatlah
Marcind
jawaban untuk pertanyaan ini. Apa yang Anda alami adalah batasan untuk meletakkan tampilan deklaratif diApp_Code
folder.sumber
Saya membuat metode ekstensi untuk pembantu Halaman Web sehingga saya bisa mendapatkan akses ke pembantu halaman.
sumber
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
dan@using System.Web.Mvc.Html
ke file pembantu cshtml di dalam App_CodeHtmlHelper
kelas untuk tujuan pengkodean, saya menemukan cara yang lebih cepat untuk melakukannya adalah melalui kelas statisMicrosoft.Security.Application.Encoder
seperti di:Encoder.HtmlAttributeEncode(value)
Omar mendapat jawaban yang benar di sini, tetapi saya ingin menambahkan sesuatu (jangan ragu untuk menandai tanggapan Omar sebagai jawabannya).
Kami menyadari hal ini di v1 dan tidak bisa mendapatkan perbaikan hebat dalam produk, tetapi David Ebbo (seorang arsitek di tim ASP.Net) memposting contoh Visual Studio Code Generator yang pada dasarnya adalah eksplorasi pertama dari jenis ide yang kami cari untuk membuat ini berfungsi dengan baik: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx
Cobalah dan lihat apa yang Anda pikirkan! Beri tahu David jika Anda memiliki komentar dengan memposting di blognya.
sumber
Mirip dengan @Jakes jawaban:
Pemakaian:
Sumber: Dino Esposito - Pemrograman Microsoft ASP.NET MVC
sumber
Solusi alternatif:
Tambahkan ini di atas file pisau cukur Anda:
lalu sebut saja seperti ini:
sumber
Pendekatan saya untuk ini adalah dengan hanya melewatkan halaman sebagai parameter ke metode helper. Jadi dalam contoh Anda, itu akan menjadi:
Kemudian dalam tampilan Razor Anda di mana Anda membutuhkannya, sebut saja seperti ini:
Melakukan hal ini segera memberikan Anda akses ke properti halaman seperti
Html
atauUrl
yang biasanya memiliki (dan melalui bahwaHtmlHelper
ekstensi).Sebagai manfaat tambahan (jika Anda memerlukannya), Anda juga mendapatkan akses ke properti instance seperti halaman
ViewData
.sumber
Untuk kepentingan pencari, saya mendapat kesalahan yang sama saat membuat tampilan MVC sebagai bagian dari pustaka kelas (untuk penggunaan ulang komponen). Solusinya, yang sebagian disinggung di atas, adalah menambahkan pernyataan menggunakan berikut di bagian atas file .cshtml:
Tidak perlu pekerjaan lebih lanjut.
sumber
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
saat melayang@using System.Web.Mvc
. Ada ide?Saya tahu bahwa ada beberapa masalah intellisense dengan MVC 3. Saya pikir pembantu akan tetap berfungsi jika namespace Anda disetel di web.config.
MVC 3 RTM baru saja dirilis, apakah Anda menggunakan ini atau beta?
sumber
Sepertinya ASP.NET MVC telah memperbaiki masalah ini pada VS 2013. Lihat posting ini http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- htmlhelper-ht
sumber
@using System.Web.Mvc.Html
di bagian atas file cshtml di App_Code, tetapi menulis @Html .... tidak mengungkapkan metode ekstensi sepertiEditorFor
. Sungguh konyol bahwa ini tidak berfungsi setelah 2 rilis utama dan posting blog mengklaim itu telah diterapkan. Ini bukan. Faktanya, metode ekstensi tidak dapat berfungsi, karena mereka menargetkan kelas System.Web.Mvc.HtmlHelper, bukan kelas System.Web.WebPages.HtmlHelper, yang diekspos oleh kelas System.Web.WebPages.HelperPage.