2017-08-08 2 views
-1

J'ai ce filtre dans mon application MVC 4:Comment résoudre CultureNotFoundException dans l'application MVC 4?

using System.Globalization; 
using System.Threading; 
using System.Web.Mvc; 
using System; 

namespace MvcApplication20.Filters 
{ 
    public class CultureFilter : IAuthorizationFilter 
    { 
     private readonly string defaultCulture; 

     public CultureFilter(string defaultCulture) 
     { 
      this.defaultCulture = defaultCulture; 
     } 

     public void OnAuthorization(AuthorizationContext filterContext) 
     { 
      try 
      { 
       var values = filterContext.RouteData.Values; 

       string culture = (string)values["culture"] ?? this.defaultCulture; 

       CultureInfo ci = new CultureInfo(culture); 

       Thread.CurrentThread.CurrentCulture = ci; 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(ci.Name); 
      } 
      catch (Exception e) 
      { 
       Utility.Utility.WriteLineToConsole("Exception: " + e.Message); 
      } 
     } 
    } 
} 

J'utilise le routage pour couvrir la localisation de ma demande, donc je dois avoir une partie de la langue dans l'URL comme par exemple:

http://localhost:5556/en/ControllerName/ControllerMethod 

le problème est, si je retire accidentellement la partie de la langue dans l'URL-à-dire la culture, je reçois « Not Found » page dans le navigateur et le débogage je reçois CultureNotFoundException avec le message: « la culture est pas prise en charge.". Bien sûr, il ne peut pas gérer ControllerName comme une culture/langue.

Toujours, La page "" n'a pas été identifiée. Elle ne vous indique pas où le problème est apparu.

Quelle est la meilleure façon de m'avertir, moi ou l'utilisateur, que je manque la partie de langue dans l'URL?

Est-ce que la classe CultureInfo a une façon spécifique de gérer une culture inconnue?

+2

« Est-ce que la classe CultureInfo a une manière spécifique faire face à une culture inconnue? " Oui? Il jette CultureNotFoundException ..... Je ne comprends tout simplement pas cette question. –

+0

Oui, je pourrais bien, comment devrais-je passer des données à ma page "introuvable" pour afficher l'erreur qui s'est produite. – Vlad

+0

Cela dépendra bien sûr de cette page, je ne peux pas répondre à cela. Attrapez cette exception spécifique puis, en réponse, affichez un message d'erreur et/ou une page appropriés. –

Répondre

1

Vous pouvez rediriger vers un contrôleur/une méthode d'action en transmettant votre code d'erreur, puis en vérifiant l'affichage des erreurs avec ce code d'erreur et afficher l'erreur en tant que «Culture introuvable».

Dans votre bloc catch, vous pouvez écrire comme

context.Result = RedirectToRoute("StatusCodeRoute", new { statusCode = "1001" }); 

puis dans le contrôleur StatusCode

[Route("/StatusCode/{statusCode}", Name = "StatusCodeRoute")] 
     public IActionResult Index(int statusCode) 
     { 
      return View(statusCode); 

     } 

et votre vue d'erreur

@model int 

    @{ 

     var statusCode = Model; 

     var statusmessage = ""; 

     switch (statusCode) 

     { 

      case "1001": 

       statusmessage = "Culture not found"; 

       break; 


      default: 

       statusmessage = "That’s odd... Something we didn't expect happened"; 

       break; 

     } 

    } 

    <div class="jumbotron"> 

     <h1>Error @Model</h1> 

     <h3>@statusmessage</h3> 

    </div>