如何在IController Execute()中返回包含资源值的视图?

8 浏览
0 Comments

如何在IController Execute()中返回包含资源值的视图?

我正在进行自定义错误处理。

我的代码:

Global.asax:

public void Application_Error(Object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values.Add("controller", "ErrorPage");
    routeData.Values.Add("action", "Error");
    routeData.Values.Add("exception", new HandleErrorInfo(exception, "ErrorPage", "Error"));
    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }
    Response.TrySkipIisCustomErrors = true;
    var controller = new ErrorPageController();
    ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();
}

Controller:

public class ErrorPageController : Controller
{
    public ActionResult Error(int statusCode, HandleErrorInfo exception)
    {
        Response.StatusCode = statusCode;
        ViewBag.StatusCode = statusCode.ToString();
        return View(exception);
    }
}

View:

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = Resource.Error+ " " + (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500" ;
}

@(Resource.Error + " " + (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500" +". "+ Resource.Sorry):

@Resource.MainPage

这基本上是稍作修改的这个答案。

如果我的视图包含任何`Resource`值,浏览器只会得到错误代码,没有页面。如果我移除所有这些值,就可以正常工作。有没有办法使视图与资源一起工作?

此外,`Application_Error`中的`controller`方法是否应在方法中被处理?

0
0 Comments

有时候,如果文件没有完全填满,资源就不会出现。例如,如果你的资源文件有20个条目,那么resource.lang.resx必须有相同的20个条目。在那个时候是否使用它并不重要。

问题的原因:

问题的原因是资源文件没有完全填满。如果资源文件中的条目数量与资源文件中定义的条目数量不匹配,那么在返回视图时,资源就无法正确显示。

解决方法:

要解决这个问题,可以通过确保资源文件中的条目数量与资源文件中定义的条目数量相匹配来修复。

代码示例:

public class MyController : IController
{
    public void Execute(RequestContext requestContext)
    {
        // ...
        // Make sure the number of entries in resource file matches the defined entries
        if (Resources.MyResource.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true).Count != Resources.MyResource.NumberOfEntries)
        {
            // Log or handle the mismatched entries
            // Redirect to an error page or return a specific view with an error message
            var errorModel = new ErrorViewModel { Message = "Resource file mismatch" };
            var errorView = new ViewResult { ViewName = "Error", ViewData = new ViewDataDictionary(errorModel) };
            errorView.ExecuteResult(requestContext);
            return;
        }
        // ...
        // Return the view with the resource values
        var model = new MyViewModel
        {
            ResourceValue1 = Resources.MyResource.ResourceValue1,
            ResourceValue2 = Resources.MyResource.ResourceValue2,
            // ...
        };
        var view = new ViewResult { ViewName = "MyView", ViewData = new ViewDataDictionary(model) };
        view.ExecuteResult(requestContext);
    }
}

这样,当资源文件中的条目数量与定义的条目数量不匹配时,将返回一个错误视图,并显示相应的错误消息。如果条目数量匹配,将返回包含资源值的视图。

通过这种方式,我们可以确保资源在返回视图时能够正确显示,避免了资源文件不完全导致的显示问题。

0