2010-01-04 13 views
22

मुझे एक निराशाजनक समस्या का सामना करना पड़ रहा है। मेरी एमवीसी साइट अधिकांश भाग के लिए ठीक चलती है, लेकिन यादृच्छिक रूप से एक त्रुटि फेंकता है (जो उपयोगकर्ता को एक दोस्ताना त्रुटि दिखाती है)। मैं लॉग की जांच करते हैं, तो यह है कि मैं क्या मिलता है:अरग! System.Web.Mvc.HandleErrorInfo मेरे विचारों को क्यों पास करता है?

System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Web.Mvc.HandleErrorInfo' but this dictionary requires a model item of type 'BaseViewData'. 

क्षणों बाद, एक ही उपयोगकर्ता ताज़ा और पृष्ठ लोड ठीक मारा सकता है। मैं फँस गया हूँ। ; (

अद्यतन: जोड़ा स्टैक ट्रेस

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Web.Mvc.HandleErrorInfo' but this dictionary requires a model item of type 'BaseViewData'. 
    at System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) 
    at System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) 
    at System.Web.Mvc.HtmlHelper`1..ctor(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection) 
    at System.Web.Mvc.ViewMasterPage`1.get_Html() 
    at ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) 
    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
    at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
    at System.Web.UI.Control.Render(HtmlTextWriter writer) 
    at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
    at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) 
    at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) 
    at System.Web.UI.Page.Render(HtmlTextWriter writer) 
    at System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) 
    at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 
    at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    --- End of inner exception stack trace --- 
    at System.Web.UI.Page.HandleError(Exception e) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest() 
    at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) 
    at System.Web.UI.Page.ProcessRequest(HttpContext context) 
    at ASP.views_shared_error_aspx.ProcessRequest(HttpContext context) 
    at System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext) 
    at System.Web.Mvc.WebFormView.RenderViewPage(ViewContext context, ViewPage page) 
    at System.Web.Mvc.WebFormView.Render(ViewContext viewContext, TextWriter writer) 
    at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 
    at System.Web.Mvc.Controller.ExecuteCore() 
    at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) 
    at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) 
    at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) 
    at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

उत्तर

14

Here का कारण बताते हुए कि त्रुटि तब होती है codeplex पर एक मुद्दा है http://web.archive.org/web/20131004122626/http://aspnet.codeplex.com/workitem/1795 से

उद्धरण के बाद से मूल लिंक मर चुका है:

हैंडलरर विशेषता स्टोरी नहीं होनी चाहिए ViewData

में अपवाद जानकारी जब HandleError विशेषता अपवाद को संभालती है, तो यह ViewData में अपवाद जानकारी संग्रहीत करती है। यह एक समस्या है जब Error.aspxsite.master से विरासत में मिलता है और site.master कक्षा निम्नानुसार घोषित की जाती है।

public partial class Site : System.Web.Mvc.ViewMasterPage<SiteViewData> 
{ 
} 

SiteViewData शामिल हैं:

public class SiteViewData 
{ 
    public String Title { get; set; } 
} 

प्रत्येक पृष्ठ ViewData वर्ग SiteViewData वर्ग से विरासत और इस

public class IndexViewData : SiteViewData 
{ 
    public String Message { get; set; } 
    public String SupportedLanguages {get; set;} 
} 

की तरह कुछ यह दृष्टिकोण एक Site.Master पृष्ठ के रूप में कोड लिखने की अनुमति देता दिखता है

<title><%= Html.Encode(ViewData.Model.Title) %></title> 

दुर्भाग्यवश, जब एक अपवाद फेंक दिया जाता है, तो मॉडल को HandleErrorInfo वर्ग के उदाहरण के साथ बदल दिया गया है। यह InvalidOperationException को

शब्दकोश में पारित मॉडल आइटम System.Web.Mvc.HandleErrorInfo प्रकार का मॉडल आइटम है, लेकिन इस शब्दकोश को Igwt.Boh.Website.Web.Controllers.SiteViewData के मॉडल आइटम की आवश्यकता है।

क्या कक्षा में कक्षा के उदाहरण को संग्रहीत करने के लिए क्लास में जोड़ा जा सकता है? इस प्रकार ViewData बदल नहीं है।

संभावनाएं बहुत अच्छी हैं कि कार्रवाई में फेंक दिया गया कोई भी अपवाद IndexViewData (और SiteViewData) गुणों के बाद पहले ही शुरू हो चुका है।

द्वारा

बंद जनवरी 27, 2010 12:24 पूर्वाह्न ठीक नहीं होगा - टिप्पणियों को देखने।


टिप्पणी "wontfix" के साथ उल्लेख किया यह आसपास काम कर रहे (बोल्ड) के लिए अपने सुझाव के साथ-साथ, माइक्रोसॉफ्ट टीम के एक पूर्व सदस्य से कर रहे हैं:

समय [HandleError तक ] विशेषता निष्पादित करती है, हमने को मूल ActionResult ऑब्जेक्ट के संदर्भ में खो दिया है। हम यह भी नहीं जानते कि क्या आप वैसे भी एक दृश्य दिखाना चाहते हैं - शायद आप रीडायरेक्ट करना चाहते हैं। पाइपलाइन (ViewResult) का हिस्सा नियंत्रक से मॉडल को देखने के लिए ज़िम्मेदार होगा चला गया।

यदि कोई अपवाद होता है, तो कोई भी मॉडल पर काम कर रहा था, शायद किसी भी तरह भ्रष्ट या अनुपलब्ध माना जाना चाहिए। सर्वोत्तम अभ्यास आपके त्रुटि दृश्य को लिखना होगा जैसे न तो यह और न ही इसकी निर्भरता (जैसे इसके मास्टर पेज) को मूल मॉडल की आवश्यकता है।

+3

आप इसे किसी न किसी ... मैं थोड़ा इसे में खुदाई कर रहा था और मुझे लगता है कि मैं खोजने कि समस्या साइट मास्टर पेज की आवश्यकता है कि से पाने त्रुटि पृष्ठों के साथ था करने के लिए सही रास्ते पर था। कम से कम यह एक आसान फिक्स है, मैं अपने त्रुटि पृष्ठों से प्राप्त करने के लिए बस एक नया मास्टर पेज तैयार करूंगा। धन्यवाद! – Chaddeus

+0

आपका स्वागत है :) –

+0

हैलो çağdaş हम उपरोक्त दिए गए समाधान को समझने और लागू करने में सक्षम नहीं हैं। क्या आप समाधान को कार्यान्वित करने के तरीके पर विस्तार से बता सकते हैं। शब्दकोश में पास किया गया मॉडल आइटम 'System.Web.Mvc.HandleErrorInfo' प्रकार का है, लेकिन इस शब्दकोश के लिए 'MAQ.Host.Models.ErrorModel' प्रकार के मॉडल आइटम की आवश्यकता होती है। System.Web.Mvc.ViewDataDictionary'1.SetModel (ऑब्जेक्ट वैल्यू) पर System.Web.Mvc.ViewDataDictionary..ctor (ViewDataDictionary शब्दकोश) पर MAQ.Host.EntityLayer.ViewBasePage'1.SetViewData (ViewDataDictionary viewData) –

1

मैं दृढ़ता से टाइप किया विचारों के साथ इस त्रुटि थी और यह भी त्रुटि पृष्ठ नियंत्रक और कार्रवाई नाम से मेल करने मूल अनुरोध संदर्भ के RouteData.Values ​​[ "नियंत्रक"] और "कार्रवाई" की स्थापना करके यह तय की।

यदि आप यहां देखते हैं तो आपको एक उन्नत हैंडलरर एट्रिब्यूट कार्यान्वयन दिखाई देगा जो JSON समर्थन के अलावा आपको परिणाम दृश्य के साथ बेस क्लास में क्या चल रहा है।

http://www.dotnet-tricks.com/Tutorial/mvc/19D9140313-Exception-or-Error-Handling-and-Logging-in-MVC4.html

ViewResult निर्माण यहाँ माइक्रोसॉफ्ट द्वारा इस्तेमाल किया तर्क ऐसा कुछ है, तो समस्या हो सकती है कि यह केवल एक नया (त्रुटि स्थिति) देखने के लिए, नहीं नियंत्रक या कार्रवाई निर्दिष्ट करने के लिए सक्षम है (के रूप में यह मूल अनुरोध से बदल गया है)। शायद यही कारण है कि एमवीसी ढांचे/हैंडलर टाइप किए गए विचारों से भ्रमित हो रहे हैं। यह मेरे लिए एक बग की तरह लगता है।

ऊपर के उदाहरण यह सुधार शामिल नहीं है, तो आप इस प्रकार इसे संपादित करना होगा (अंतिम दो पंक्तियों और टिप्पणी नये हैं):

var model = new HandleErrorInfo(httpError, controllerName, actionName); 
filterContext.Result = new ViewResult 
{ 
    ViewName = View, 
    MasterName = Master, 
    ViewData = new ViewDataDictionary(model), 
    TempData = filterContext.Controller.TempData 
}; 

// Correct routing data when required, e.g. to prevent error with typed views 
filterContext.RouteData.Values["controller"] = "MyError"; // MyErrorController.Index(HandleErrorInfo) 
filterContext.RouteData.Values["action"] = "Index"; 

आप एक फिल्टर में यह से निपटने नहीं कर रहे हैं/विशेषता तब आपको केवल अंतिम दो पंक्तियों की तरह कुछ करने की आवश्यकता है जहां आप रूटिंग डेटा से निपट रहे हैं, उदाहरण के लिए कई "ऑनरर" उदाहरण एक त्रुटि नियंत्रक का निर्माण करते हैं तो IContoller को कॉल करें। निष्पादित करें। लेकिन यह एक और कहानी है।

वैसे भी, अगर आपको यह त्रुटि मिलती है, जहां भी आप त्रुटि को संभालने में हैं, बस मूल "नियंत्रक" और "कार्रवाई" नाम को जो कुछ भी आप उपयोग कर रहे हैं उसे रीसेट करें और यह आपके लिए भी ठीक हो सकता है।

2

मैंने अपने ऐप में एक ही समस्या को ट्रैक किया है और मेरे लिए फिक्स का वर्णन करना चाहता था। मेरे मामले में, मैं निम्नलिखित अपवाद हो रही थी:

System.InvalidOperationException: The model item passed into the dictionary is of 
type 'System.Web.Mvc.HandleErrorInfo', but this dictionary requires a model item of 
type 'Web.Models.Admin.Login'. 

और मैं [HandleError] मार्ग त्रुटियों के~/Shared/Error.cshtml

का क्या हुआ [कम से कम मेरे मामले में] था उपयोग कर रहा था: ~/Shared/Error.cshtml यह सुनिश्चित करने के लिए Layout = "~/Views/SiteLayout.cshtml"; था कि लेआउट/सीएसएस को डुप्लिकेट किए बिना त्रुटि पृष्ठ सही ढंग से स्टाइल किया गया था (बाकी साइट की तरह)।

~/Views/SiteLayout.cshtml में आंशिक शामिल था: ~/Shared/LightboxLogin.cshtml जो लॉगिन के लिए इनलाइन लाइटबॉक्स प्रदान करता है। ~/Shared/LightboxLogin.cshtml वास्तविक लॉगिन फ़ॉर्म को एम्बेड करने के लिए और आंशिक था: @Html.Partial("Login") जिसमें ~/Shared/Login.cshtml शामिल है, यह साइट के फ्रंट-एंड पर लॉगिन कार्यक्षमता के लिए उपयोग किया जाता है।

क्योंकि साइट के व्यवस्थापक क्षेत्र में त्रुटि हुई थी, नियंत्रक "व्यवस्थापक" था और जब कोई त्रुटि हुई, Error.cshtml लागू किया गया था, जिसमें मॉडल के साथ SiteLayout.cshtml शामिल था। बदले में इसमें LightboxLogin शामिल था, जिसमें आंशिक, Login शामिल था ... लेकिन~/Admin/Login.cshtml में एक और दृश्य था जिसमें @Html.Partial("Login") इसके बजाय शामिल किया गया था। @model Web.Models.Admin.Login

तो, यहाँ सीखा सबक अपने partials कि आप शामिल करना चाहते हैं अपने नामकरण के लिए सावधान रहना है:

~/Admin/Login.cshtml पर यह दृश्य इस किया था। यदि ~/Shared/Login.cshtml~/Shared/PublicLoginForm.cshtml और @Html.Partial("PublicLoginForm") का उपयोग किया गया था तो इस समस्या से बचा जाना चाहिए था।

Sidenote: मैं तो इस तरह तय [के रूप में मैं अपने विचार पुनर्गठन नहीं करना चाहता था]:

@if (!(Model is HandleErrorInfo)) 
{ 
    @Html.Partial("LightboxLogin") 
} 

कौन सा आंशिक मतलब है शामिल नहीं है जब लेआउट एक त्रुटि हालत में शामिल है।

6

समस्या से निपटने के लिए मेरा समाधान लेआउट पेज के शीर्ष पर @ मॉडल कोड को हटाना है और फिर कुछ चेक करें जहां मैं आम तौर पर पारित होने वाले विभिन्न मॉडलों के बीच स्विच करने के लिए अपने मॉडल को देखने की अपेक्षा करता हूं उदाहरण में

@if (Model is System.Web.Mvc.HandleErrorInfo) 
{ 
    <title>Error</title> 
} 
else if (Model.GetType() == typeof(MyApp.Models.BaseViewModel)) 
{ 
    <meta name="description" content="@Model.PageMetaDescription"> 
    <title>@Model.PageTitleComplete</title> 
} 
संबंधित मुद्दे