2012-05-30 2 views
0

Извините, если это глупый вопрос, но мне просто интересно, как лучше перенаправить на страницу с ошибкой , когда в модели возникла ошибка в asp.net mvc3 ,Перенаправление из модели в ASP.NET mvc3

Короче говоря, у меня есть приложение Controller, которое наследует все контроллеры, которое в функции «OnActionExecuting» проверяет, использует ли пользователь Internet Explorer.

Если это так, я вызываю функцию в моей модели ошибок (которая у меня есть, потому что я хочу зарегистрировать ошибку в базе данных), которая затем должна перенаправить пользователя на страницу с ошибкой, сообщающую загружать хром.

ApplicationController

public class ApplicationController : Controller 
{ 
    public string BASE_URL { get; set; } 

    public ApplicationController() {} 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     BASE_URL = Url.Content("~/"); 

     ErrorModel err = new ErrorModel(); 

     String userAgent; 
     userAgent = Request.UserAgent; 
     if (userAgent.IndexOf("MSIE") > -1) { 
      err.cause("browser", "redirect", "some other info"); 
     }   
    } 
} 

ErrorModel

public void cause(string _errCode, string strAction, string _otherInfo = "") { 

     this.error_code = _errCode; 
     this.error_otherInfo = _otherInfo; 

     try { 
      this.error_message = dctErrors[_errCode.ToLower()]; 
     } catch (KeyNotFoundException) { 
      this.error_message = "Message not found."; 
     } 

     StackTrace sT = new StackTrace(true); 
     String[] filePathParts = sT.GetFrame(1).GetFileName().Split('\\'); 

     this.error_filename = filePathParts.Last(); 
     this.error_lineNo = sT.GetFrame(1).GetFileLineNumber(); 

     this.error_function = sT.GetFrame(1).GetMethod().ReflectedType.FullName; 

     this.error_date = DateTime.Now; 
     this.error_uid = 0; //temporary 

     if (strAction == "redirect") { 
     //this is what I would like to do - but the "response" object does not 
     //exist in the context of the model 
      Response.Redirect("Error/" + _errCode);     
     } else if (strAction == "inpage") { 

     } else { 
      //do nothing 
     } 
    } 

Я знаю, что в этом конкретном примере, ошибка не на самом деле происходит в модели, так что я мог бы просто перенаправить от контроллера. Но я хотел бы иметь возможность вызывать одну функцию, которая будет регистрироваться, а затем перенаправлять, если это возможно, поскольку это будет необходимо для многих других ошибок, которые, вероятно, будут иметь место.

Возможно, я ошибаюсь, и в этом случае я, конечно, открыт для изменения. Спасибо за помощь!

+2

Бизнес-логика не должна быть в вашей модели. Переместите его на контроллер. – Jesse

+4

Бизнес-логика тоже не должна быть в контроллере! – c0deNinja

ответ

1

Вы можете получить доступ к ответу из HttpContext.

HttpContext.Current.Response 
1

Я лично использую глобальный exception filter, предоставленный структурой MVC, для записи в журнал ошибок. Я также использую по умолчанию перенаправление с представлением об ошибке через веб-конфигурации:

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/"> 

Есть, конечно, возможные недостатки этой модели, но она охватывает большую часть исключений, с которыми я столкнулся до сих пор.

0

ЕГО МНОГО SIMPLE,

Вы должны присвоить результат (ActionResult) К filterContext.Result

filterContext.Result = View("ErrorView", errorModel); 

или перенаправлять

filterContext.Result = Redirect(url); 

или

filterContext.Result = RedirectToAction("actionname"); 
Смежные вопросы