एमवीसी 3 आरटीएम का उपयोग करके मुझे एक अजीब NullReferenceException
मिल रहा है:
@helper TestHelperMethod() {
var extra = "class=\"foo\"";
<div @Html.Raw(extra)></div>
}
यह पता चला है कि Html
(HtmlHelper
प्रकार का) null
है।
मैंने इसे पहले कभी नियमित रूप से नहीं देखा। मैं रेजर में घोषणात्मक सहायक विधियों के साथ प्रयोग करना शुरू कर रहा हूं (अब तक वे थोड़े सीमित लगते हैं) और जो मैं यहां देख रहा हूं उससे मैं काफी स्तब्ध हूं।
6 जवाब
यह उन सहायकों की ज्ञात सीमा है। इसे पैरामीटर के रूप में पास करने की एक संभावना है:
@helper TestHelperMethod(HtmlHelper html) {
var extra = "class=\"foo\"";
<div@html.Raw(extra)></div>
}
एक अन्य संभावना सहायक को विस्तार विधि के रूप में लिखना है:
public static class HtmlExtensions
{
public static MvcHtmlString TestHelperMethod(this HtmlHelper)
{
var div = new TagBuilder("div");
div.AddCssClass("foo");
return MvcHtmlString.Create(div.ToString());
}
}
और फिर:
@Html.TestHelperMethod()
ड्रू नोज़ सुझाव का उपयोग करते हुए, मैं एक समाधान पर आया हूं जो अभी के लिए चाल है और जिसे समस्या हल होने के बाद आसानी से हटाया जा सकता है एमवीसी के एक नए संस्करण में (यानी अगर अधिक सामान नहीं बदला गया है जो इसे तोड़ देगा :))
लक्ष्य एक घोषणात्मक सहायक विधि के अंदर एक HtmlHelper का उपयोग करने में सक्षम होना है जो NullReferenceException के बिना App_Code में फ़ाइल में रहता है। इसे हल करने के लिए मैंने निम्नलिखित में App_Code की सभी फाइलों में शामिल किया:
@using System.Web.Mvc;
@functions
{
private static new HtmlHelper<object> Html
{
get { return ((WebViewPage)CurrentPage).Html; }
}
private static UrlHelper Url
{
get { return ((WebViewPage)CurrentPage).Url; }
}
}
ऐसा लगता है कि यह चाल चल रही है क्योंकि अब मैं निम्नलिखित सहायक (उसी फाइल में) लिख सकता हूं:
@helper PrintAsRaw(string htmlString)
{
@Html.Raw(htmlString)
}
जाहिर है सहायक विधि सिर्फ एक उदाहरण है। इस समाधान का नकारात्मक पक्ष यह है कि @functions घोषणाओं को App_Code में सभी सहायक घोषणा फ़ाइलों में पेश किया जाना है, लेकिन हेल्पर को कॉल को जटिल बनाने से बचता है, जैसा कि आप बस एक दृश्य में लिख सकते हैं:
@MyAppCodeFile.PrintAsRaw("<p>My paragraph</p>")
उम्मीद है ये मदद करेगा...
मुझे पता है कि यह बात नहीं है, लेकिन अगर यह सिर्फ Html.Raw(value)
है, तो आप सिस्टम के स्रोत कोड के अनुसार Google (जैसा कि मैं था) पर इस प्रश्न को ढूंढते समय उपयोग करने की उम्मीद कर रहे थे। Web.Mvc.dll सभी Html.Raw करता है है:
public IHtmlString Raw(string calue)
{
return new HtmlString(value);
}
तो मैंने अपने सहायक में अभी @(new HtmlString(value))
का उपयोग किया है जो अच्छी तरह से काम करता है।
बस बदलें
@Html.Raw(extra)
साथ
@(new HtmlString(extra))
मुझे लगता है कि मुझे पता है कि समस्या का कारण क्या है ...
Html
संपत्ति पाने वाले की परिभाषा है:
public static HtmlHelper Html {
get {
WebPage currentWebPage = CurrentPage as WebPage;
if (currentWebPage == null) {
return null;
}
return currentWebPage.Html;
}
}
मेरी सहायक विधि में ब्रेकपॉइंट सेट करना दर्शाता है कि CurrentPage
वास्तव में WebPage
का उदाहरण नहीं है, इसलिए null
मान है।
यहाँ CurrentPage
का प्रकार पदानुक्रम है (मेरी कक्षा के नाम थोड़े से सिद्ध हैं):
ASP._Page_Views_mycontroller_View_cshtml
My.Site.MyWebViewPage`1
System.Web.Mvc.WebViewPage`1
System.Web.Mvc.WebViewPage
System.Web.WebPages.WebPageBase
System.Web.WebPages.WebPageRenderingBase
System.Web.WebPages.WebPageExecutingBase
System.Object
ध्यान दें कि मेरे विचार का आधार वर्ग Web.config में निर्दिष्ट किया गया है:
<system.web.webPages.razor>
<pages pageBaseType="My.Site.MyWebViewPage">
...
जिसे सामान्य और गैर-सामान्य दोनों रूपों में परिभाषित किया गया है:
public abstract class MyWebViewPage : WebViewPage { ... }
public abstract class MyWebViewPage<TModel> : WebViewPage<TModel> { ... }
इसलिए, यदि यह समस्या दूसरों के लिए नहीं होती है, तो शायद वे कस्टम pageBaseType
का उपयोग नहीं कर रहे हैं।
यह भी ध्यान दें कि मैंने @helper
घोषणा को App_Code\Helpers.cshtml
में इस उम्मीद में रखा है कि इसे वैश्विक रूप से सुलभ बनाया जा सके।
क्या मैं कुछ गलत कर रहा हूँ, या यह एक बग है?
संपादित करें इसे एक ज्ञात समस्या के रूप में इंगित करने के लिए धन्यवाद डारिन। फिर भी, Html
संपत्ति को इस रूप में फिर से परिभाषित क्यों नहीं किया गया है:
public static HtmlHelper Html {
get {
WebPage currentWebPage = CurrentPage as WebPage;
if (currentWebPage != null) {
return currentWebPage.Html;
}
WebViewPage currentWebViewPage = CurrentPage as WebViewPage;
if (currentWebViewPage != null) {
return currentWebViewPage.Html;
}
return null;
}
}
मेरे पास एक ही समस्या थी और कोड की इस पंक्ति ने चाल चली। यह एचटीएमएल हेल्पर का उपयोग करने का समाधान नहीं है, यह एक घोषणात्मक रेजर सहायक में रॉ एचटीएमएल लिखने का एक तरीका है।
@{CurrentPage.WriteLiteral("html code");}
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
.net
.NET कोर के बारे में प्रश्नों के लिए उपयोग न करें - इसके बजाय [.net-core] का उपयोग करें। .NET फ्रेमवर्क मुख्य रूप से माइक्रोसॉफ्ट विंडोज ऑपरेटिंग सिस्टम के लिए डिज़ाइन किया गया एक सॉफ्टवेयर फ्रेमवर्क है। इसमें बेस क्लास लाइब्रेरी, कॉमन लैंग्वेज रनटाइम (आमतौर पर सीएलआर के रूप में संदर्भित), कॉमन टाइप सिस्टम (आमतौर पर सीटीएस के रूप में संदर्भित) और डायनेमिक भाषा रनटाइम का कार्यान्वयन शामिल है। यह C #, VB.NET, F # और C ++ / CLI सहित कई प्रोग्रामिंग भाषाओं का समर्थन करता है।