2013-06-19 3 views
9

मैं User संपत्ति प्रकार को "ओवरराइड" करने के लिए एक एमवीसी कस्टम बेस व्यू पेज को कार्यान्वित करने का प्रयास कर रहा हूं। इससे मेरा CustomPrincipal किसी भी दृश्य में सुलभ हो जाएगा।एक कस्टम एमवीसी बेस व्यू लागू करें पृष्ठ

वेब खोजने के बाद, मुझे Phil Haack's instructions for implementing a custom base view page मिला। मैंने निर्देशों का पालन किया जैसा कि वे लिखे गए हैं, लेकिन दृश्य में गुणों तक पहुंचने के दौरान मैं एक समस्या में भाग गया।

जब मैं कोई दृश्य खोलता हूं, तो किसी भी पिछले एचटीएमएल सहायक कार्यों को नीली, स्क्विग्ली लाइन के साथ रेखांकित किया जाता है। जब मैं अपने कर्सर को @Html भाग पर डालता हूं, तो यह त्रुटि प्रकट करता है:

"एचटीएमएल संदिग्ध है, नामस्थान या प्रकारों से आयातित है 'System.Web.WebPages, System.Web.Mvc'।"

अब, मुझे समझ में आता है कि मुझे संदेश क्यों मिल रहा है, लेकिन मुझे समझ में नहीं आता कि इसे कैसे ठीक किया जाए। मुझे नहीं पता कि इससे कोई फर्क नहीं पड़ता, लेकिन वर्तमान एप्लिकेशन विजुअल बेसिक में बनाया गया था। द्वितीयक परीक्षण के रूप में, मैंने सी # में एक और एमवीसी एप्लीकेशन बनाया और कस्टम बेस व्यू पेज को लागू करने का प्रयास किया। सी # आवेदन में यह ठीक काम किया। मैं विचारों के भीतर से अपनी कस्टम संपत्ति का उपयोग कर सकते हैं।

मैंने वेब को इस मुद्दे के उत्तर की तलाश में डाला है, लेकिन अभी तक कुछ भी नहीं मिला है। क्या कोई और इसी तरह के मुद्दे पर चला गया है?

BaseViewPage

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Mvc; 
using CCInfoController; 

namespace CCInfo.Web.Mvc 
{ 
    public class BaseViewPage<TModel> : WebViewPage<TModel> 
    { 
     public new CustomPrincipal User 
     { 
      get 
      { 
       return base.User as CustomPrincipal; 
      } 
     } 

     public override void Execute() 
     { 
     } 
    } 
} 

~/दृश्य/web.config

<configuration> 
    <configSections> 
    <sectionGroup name="system.web.webPages.razor" 
     type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, 
     System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35"> 
    <section name="host" 
     type="System.Web.WebPages.Razor.Configuration.HostSection, 
     System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
    <section name="pages" 
     type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, 
     System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
    </sectionGroup> 
    </configSections> 

    <system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, 
     System.Web.Mvc, Version=3.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="CCInfo.Web.Mvc.BaseViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.WebPages"/> 
     <add namespace="CCInfoController" /> 
     </namespaces> 
    </pages> 
    </system.web.webPages.razor> 
    ... 
</configuration> 
+0

आप जो करने की कोशिश कर रहे हैं उसे समझें। WebViewPage क्यों? क्यों नहीं देखते? एमवीसी में कोई वेबव्यूपेज नहीं है या मुझे कुछ याद आ रहा है। और उपयोगकर्ता प्रिंसिपल सामान्यता एचटीपी कॉनटेक्स्ट का हिस्सा है। – maxs87

+1

असल में, 'वेब व्यूपेज' वास्तव में [एमवीसी ढांचे का एक हिस्सा] है (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.98%29.aspx)। और हां, 'उपयोगकर्ता' संपत्ति 'HttpContext' का हिस्सा है और दृश्य के माध्यम से सुलभ है। मैं जो करने में सक्षम होना चाहता हूं वह 'उपयोगकर्ता' प्रॉपर्टी तक पहुंच है, लेकिन उस प्रॉपर्टी के प्रकार को 'आईपीआर प्रिंसिपल' की बजाय मेरे 'कस्टम प्रिंसिपल' में बदलने के लिए बेस व्यू पेज का उपयोग करें। सही बात? – hitopp

+2

ईमानदारी से, मुझे लगता है कि उपयोगकर्ता को स्वयं कास्टिंग करने से बचने के लिए यह बहुत अधिक परेशान है। यदि आप इसे अक्सर उपयोग करते हैं, तो मैं केवल आईपीरियनल के लिए एक एक्सटेंशन विधि तैयार करूंगा जो इसे रोकता है। बहुत कम प्रयास, और प्रत्येक पृष्ठ में अतिरिक्त कोड करने की आवश्यकता नहीं है। याद रखें, आपको कंट्रोलर से भी, और संभवतः एपीकंट्रोलर और कई अन्य लोगों से प्राप्त करना होगा। यह सोलिड में ओ का प्रतीक है, जो खुला/बंद सिद्धांत है। विरासत ओसीपी का उल्लंघन करता है। –

उत्तर

3

आप की जरूरत है:

संदर्भ के लिए, मैं अपने कस्टम आधार दृश्य पेज और ~/Views/web.config नीचे शामिल WebViewPage के 2 संस्करण प्रदान करने के लिए, एक सामान्य और गैर-जेनेरिक।

public class BaseViewPage<TModel> : WebViewPage<TModel> 
{ 
} 


public class BaseViewPage : WebViewPage 
{ 
} 
संबंधित मुद्दे