एमवीसी 3 आरटीएम का उपयोग करके मुझे एक अजीब NullReferenceException मिल रहा है:

@helper TestHelperMethod() {
    var extra = "class=\"foo\"";
    <div @Html.Raw(extra)></div>
}

यह पता चला है कि Html (HtmlHelper प्रकार का) null है।

मैंने इसे पहले कभी नियमित रूप से नहीं देखा। मैं रेजर में घोषणात्मक सहायक विधियों के साथ प्रयोग करना शुरू कर रहा हूं (अब तक वे थोड़े सीमित लगते हैं) और जो मैं यहां देख रहा हूं उससे मैं काफी स्तब्ध हूं।

40
Drew Noakes 12 मार्च 2011, 16:05

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()
35
Community 23 मई 2017, 14:47

ड्रू नोज़ सुझाव का उपयोग करते हुए, मैं एक समाधान पर आया हूं जो अभी के लिए चाल है और जिसे समस्या हल होने के बाद आसानी से हटाया जा सकता है एमवीसी के एक नए संस्करण में (यानी अगर अधिक सामान नहीं बदला गया है जो इसे तोड़ देगा :))

लक्ष्य एक घोषणात्मक सहायक विधि के अंदर एक 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>")

उम्मीद है ये मदद करेगा...

40
Community 23 मई 2017, 15:26

मुझे पता है कि यह बात नहीं है, लेकिन अगर यह सिर्फ Html.Raw(value) है, तो आप सिस्टम के स्रोत कोड के अनुसार Google (जैसा कि मैं था) पर इस प्रश्न को ढूंढते समय उपयोग करने की उम्मीद कर रहे थे। Web.Mvc.dll सभी Html.Raw करता है है:

public IHtmlString Raw(string calue)
{
    return new HtmlString(value);
}

तो मैंने अपने सहायक में अभी @(new HtmlString(value)) का उपयोग किया है जो अच्छी तरह से काम करता है।

25
BritishDeveloper 30 अप्रैल 2012, 14:20

बस बदलें

 @Html.Raw(extra)

साथ

@(new HtmlString(extra))
15
Otto Kanellis 24 अप्रैल 2013, 17:37

मुझे लगता है कि मुझे पता है कि समस्या का कारण क्या है ...

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;
    } 
} 
5
Drew Noakes 13 मार्च 2011, 19:40

मेरे पास एक ही समस्या थी और कोड की इस पंक्ति ने चाल चली। यह एचटीएमएल हेल्पर का उपयोग करने का समाधान नहीं है, यह एक घोषणात्मक रेजर सहायक में रॉ एचटीएमएल लिखने का एक तरीका है।

@{CurrentPage.WriteLiteral("html code");}
1
Drew Noakes 7 मार्च 2012, 16:38