2010-08-25 10 views
7

मैं ActionFilterAttribute वर्गASP.NET MVC वापसी ViewResult

नीचे की तरह

से एक ViewResultOnActionExecuted में विधि ओवरराइड वापस जाने के लिए कोशिश कर रहा है ...

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    if (CreateCookie && filterContext.Exception == null) 
    { 
     LoginCookies lcookie = new LoginCookies(usuDs, usuSenha); 
     lcookie.WriteCookie("SCE", 10); 
    } 
    else 
    { 
     filterContext.Result = new ViewResult() { ViewName = "Login" }; 
     filterContext.Result.ExecuteResult 
       (filterContext.Controller.ControllerContext); 
    } 

यह एक दृश्य "लॉग इन" कहा जाता है पर लौटने के लिए ठीक काम करता है , लेकिन मुझे मॉडल ऑब्जेक्ट को इस दृश्य में पास करने की आवश्यकता है (इस मामले में मॉडल ऑब्जेक्ट उपयोगकर्ता का प्रकार है) और मुझे नहीं पता कि ViewResult कक्षा का उपयोग करके इसे कैसे पास किया जाए।

कोई विचार?

UPDATED: मैं मेरी समस्या सही पर filterContext.ExceptionHandled की स्थापना समाधान कर लिया है, लेकिन मुख्य समस्या हल नहीं किया गया था, मैं View की Model गुण सेट नहीं कर सकते हैं, यह हमेशा रिक्त है।

+0

कृपया कोड दिखाएं जो * काम नहीं करता है। – bzlm

+0

कोड ऊपर है। जब मैं उपरोक्त कोड में ViewResult लॉगिन वापस करता हूं, तो मुझे मॉडल को भी देखने के लिए पास करने की आवश्यकता होती है, अन्यथा एक अपवाद फेंकता है मॉडल मॉडल शून्य है। समस्या यह है कि मैं मॉडल को इस दृश्य में सेट नहीं कर सकता। – ozsenegal

उत्तर

2

मुझे गलत हो सकता है, लेकिन मेरा मानना ​​है कि दृश्य डेटा नियंत्रक आधार का हिस्सा है और वास्तव में दृश्य का हिस्सा नहीं है। तो आपको ऐसा करने से दृश्य डेटा सेट करने में सक्षम होना चाहिए:

filterContext.Controller.ViewData.Model = <your view model> 

मैंने अभी परीक्षण किया और यह मेरे लिए काम किया। मैं किसी भी कारण नहीं दिख रहा है यही कारण है कि यह आप के लिए काम नहीं करना चाहिए:

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     TestClass1 viewModel = new TestClass1(); 

     viewModel.FirstName = "TestFilter"; 

     filterContext.Controller.ViewData.Model = viewModel; 
    } 

Referencing documentation

+0

वाह, मैंने सोचा कि यह काम करता है, लेकिन नहीं, यह मॉडल हमेशा – ozsenegal

+0

@ozsenegal में शून्य है, उदाहरण के लिए आप OnActionExecuted ईवेंट में हैं, लेकिन क्या आप वाकई अपने वास्तविक कोड में हैं? इस बिंदु पर आपका व्यूडेटा पहुंच योग्य होना चाहिए। – joshlrogers

+0

हां, मुझे यकीन है। देखें डेटा आपके द्वारा दिखाए जाने वाले तरीके से स्वीकार्य है, लेकिन दृश्य में मॉडल संपत्ति शून्य रखती है – ozsenegal

1

हो सकता है कि यह आपके लिए काम करेंगे:

filterContext.Result = new ViewResult { ViewName = "Exception", ViewData = new ViewDataDictionary(new CmsExceptionViewData(filterContext.Exception, action, controllerName, errorMessage)) }; 

तो ViewData एक ViewDataDictionary साथ बनाई गई है जो या तो एक शब्दकोश या एक मॉडल स्वीकार करता है।

9

मैं उसी मुद्दे पर भाग गया जहां मेरा मॉडल दृश्य में पारित किया गया था हमेशा शून्य था। मैं निम्नलिखित के साथ मॉडल को अपने दृश्य में पास करने में सक्षम था:

अपना दृश्य बनाएं मॉडल और गुण सेट करें। एक नया ViewResult बनाएं जो इसे आपके व्यू का नाम दे और फिर अपना व्यू मॉडेल को व्यूडेटा में पास कर दें।

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 

    TestViewModel viewModel = new TestViewModel; 

    //Here set all the properties of your viewModel such as your exception message 

    filterContext.Controller.ViewData.Model = viewModel; 
    filterContext.Result = new ViewResult { ViewName = "Login", ViewData = new ViewDataDictionary(viewModel)}; 
    filterContext.ExceptionHandled = true; 

}