2012-09-11 19 views
7

मैं अनुरोध यूआरएल के आधार पर किसी ऑब्जेक्ट को तुरंत चालू करने के लिए एक महल विंडसर फैक्ट्री का उपयोग कर रहा हूं।मैं प्रतिक्रिया कैसे समाप्त कर सकता हूं और HTTP कोड 404 वापस भेज सकता हूं?

कुछ की तरह:

public FooViewModel Get() 
    { 
     if (HttpContext.Current == null) 
     { 
      return new FooViewModel(); 
     } 

     var currentContext = new HttpContextWrapper(HttpContext.Current); 

     // resolve actual view model. 

कुछ मामलों में, मैं वास्तव में एक 404 फेंक और अनुरोध रोकना चाहते हैं, वर्तमान में चाहते:

 throw new HttpException(404, "HTTP/1.1 404 Not Found"); 
     currentContext.Response.End(); 

हालांकि अनुरोध अभी भी खत्म नहीं होता और यह कार्रवाई को हिट करता है और दृश्य को हल करने का प्रयास करता है?

public class HomeController : Controller 
{ 
    public FooViewModel Foo { get; set; } 

    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

     return View(); 
    } 

मैं सब गलत इस बारे में सोच रहा हूँ:

मेरे नियंत्रक कुछ इस तरह दिखाई हैं? या क्या मैं इसे प्राप्त कर सकता हूं?

वैकल्पिक विकल्प मैं फू संपत्ति की स्थिति की जांच करने के लिए कार्रवाई पर एक विशेषता है?

उत्तर

6

मुझे लगता है कि एक कार्रवाई फिल्टर का उपयोग कर के दृष्टिकोण को प्राप्त कर सकता है कि आप क्या चाहते हैं कर रहे हैं:

public class RequiresModelAttribute : ActionFilterAttribute 
{ 
    private readonly string _modelName; 

    public RequiresModelAttribute(string modelName) 
    { 
     _modelName = modelName; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var property = filterContext.Controller.GetType().GetProperty(_modelName); 
     var model = property.GetValue(filterContext.Controller); 
     if (model == null) 
     { 
      filterContext.Result = new HttpStatusCodeResult(404); 
     } 
    } 
} 

फिर, अपने नियंत्रक पर तुम कर सकते हो:

public class HomeController : Controller 
{ 
    public FooViewModel Foo { get; set; } 

    [RequiresModel("Foo")] 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; 

     return View(); 
    } 
} 

संपादित करें: शायद एक वैश्विक फिल्टर का उपयोग कर किसी भी फेंक दिया HttpExceptions का सम्मान करने के लिए?

public class HonorHttpExceptionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var httpException = filterContext.HttpContext.AllErrors.FirstOrDefault(x => x is HttpException) as HttpException; 
     if (httpException != null) 
     { 
      filterContext.Result = new HttpStatusCodeResult(httpException.GetHttpCode()); 
     } 
    } 
} 
Global.asax में

तब:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
     filters.Add(new HonorHttpExceptionAttribute()); 
    } 
+0

हाँ, मैं पहले से ही यह करने के लिए यह बदल दिया है, क्या कोई अन्य सुझाव दिए गए हैं देख सकते हैं। – shenku

+0

@ शेन्कू मैंने अपनी प्रतिक्रिया को किसी अन्य दृष्टिकोण से अपडेट किया है, हो सकता है कि यह आपके परिदृश्य में बेहतर काम करेगा? –

2

एक अन्य विकल्प नियंत्रक पर OnException अधिभावी है।

public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 
     Get(); 
     return View(); 
    } 

    public int Get() 
    { 
     throw new HttpException(404, "HTTP/1.1 404 Not Found"); 
     // we don't need end the response here, we need go to result step 
     // currentContext.Response.End(); 

    } 

    protected override void OnException(ExceptionContext filterContext) 
    { 
     base.OnException(filterContext); 
     if (filterContext.Exception is HttpException) 
     { 
      filterContext.Result = this.HttpNotFound(filterContext.Exception.Message); 
     } 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे