1

额外的:

下载我尝试转换为 AttributeRouting 失败的项目。
当主页上的消息在“没有新电子邮件”之间变化时,该项目将正常运行。和“你有邮件!”。在其当前的错误状态下,该消息不会改变。
将显示 javascript 控制台中的错误。
使用浏览器直接导航到 /Checkemail 会导致 404 错误。

原帖:

这是一个关于AttributeRouting的问题(使用最新的 v3.4.1)。

我正在尝试将 a 挂接GET[""]到以下代码。

[GET("")]我得到一个 404 - 找不到资源。
[GET("CheckEmail")]我得到一个 405 - 不允许的方法。

我正在尝试将此项目转换为 AttributeRouting: source code。checkemail 操作是我失败的地方。

该方法是作为“ ajax 长轮询”技术的一部分的异步方法。

我对我惨淡的尝试发表了以下评论:

public class CheckEmailController : AsyncController
    {
        //
        // GET: /CheckEmail/

        //tried [GET("")]
        //tried [GET("CheckEmail")]
        public void IndexAsync()
        {
            AsyncManager.OutstandingOperations.Increment();
            MyAsyncEmailChecker.CheckForEmailAsync(hasEmail =>
            {
                AsyncManager.Parameters["hasEmail"] = hasEmail;
                AsyncManager.OutstandingOperations.Decrement();
            });
        }

        private class IndexResponse
        {
            public bool d { get; set; }
        }

        public JsonResult IndexCompleted(bool hasEmail)
        {
            return this.Json(new IndexResponse() { d = hasEmail });
        }

    }

Global.asax.cs - 对于我所有的 AR 项目

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
}

谢谢你

4

1 回答 1

2

如果您使用的是 ASP.NET MVC 4 和 .NET 4.5,那么您应该只使用 async 关键字和 Tasks。这应该可以解决您的路由问题并降低控制器的复杂性。这是微软白皮书的链接。

http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4

但总而言之,您的代码将更改为此。

public class CheckEmailController : AsyncController
{
    //
    // GET: /CheckEmail/
    [GET("CheckEmail")]
    public async Task<ActionResult> Index()
    {
      return View( new IndexReponse {
        d = await MyAsyncEmailChecker.CheckForEmailAsync() 
      });
    }

    public class IndexResponse
    {
        public bool d { get; set; }
    }


}
于 2013-01-29T15:53:36.627 回答