0

これがばかげた質問である場合はお詫びしますが、 asp.netmvc3のモデルでエラーが発生したときにエラーページにリダイレクトするための最善の方法を考えています。

つまり、すべてのコントローラーが継承するapplicationControllerがあり、「OnActionExecuting」関数で、ユーザーがInternetExplorerを使用しているかどうかを確認します。

もしそうなら、私は自分のエラーモデルで関数を呼び出します(データベースにエラーを記録したいのでこれを持っています)。それからユーザーをエラーページにリダイレクトして、chromeをダウンロードするように指示します。

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
        }
    }

この特定の例では、モデルでエラーが実際に発生していないことを知っているので、コントローラーからリダイレクトするだけで済みます。ただし、ログに記録して、可能であればリダイレクトする1つの関数を呼び出せるようにしたいと思います。これは、発生する可能性のある他の多くのエラーに必要になるためです。

私はこれを完全に間違った方法で行っている可能性があります。その場合、私はもちろん変更を受け入れることができます。助けてくれてありがとう!

4

3 に答える 3

1

私は個人的に、MVCフレームワークによって提供されるグローバル例外フィルターを使用して、エラーログに書き込みます。また、Web構成を介してエラービューへのデフォルトのリダイレクトを使用します。

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

もちろん、このモデルには考えられる欠点がありますが、これまでに遭遇したほとんどの例外をカバーしていました。

于 2012-05-30T18:13:39.557 に答える
1

HttpContextから応答にアクセスできます。

HttpContext.Current.Response
于 2012-05-30T18:14:07.927 に答える
0

その非常に単純な、

結果(ActionResult)をfilterContext.Resultに割り当てる必要があります

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

またはリダイレクトします

filterContext.Result = Redirect(url);

また

filterContext.Result = RedirectToAction("actionname");  
于 2012-05-30T18:21:20.240 に答える