简体   繁体   中英

MVC The resource cannot be found

Okay, this is driving me crazy.

I have this project, and I am MONTHS without touching the FeedController . Everything was working fine. Then, I opened the FeedController to change some code inside an action and for some reason, VS2010 crashed. Okay, VS already crashed before, nothing unusual.

So I restarted VS, and mysteriously, the FeedController started to give "404 The resource cannot be found" error.

So I checked Global.asax , Web.Config , StartURL, all stuff people recommend. Can't get it to work. If I call /Feed/Index , It Works! But /Feed/ just gives me the error.

Changed the name of the entire controller to ShitController and It just WORKS PERFECT! Somehow, the project decided that "Feed" is some kind of "curse word".

Cleaned solution, /bin/ restarted vs dev server, restarted computer and it is just broker forever.

I'm starting to think this is a MVC3 serious BUG.

Anyone?

I'm getting crazy. I should go for a walk, maybe :)

Routes:

routes.MapRoute(
    "XBLContentDetailsLocale",
    "XBLContent/Details/{guid}/{locale}",
    new { controller = "XBLContent", action = "Details"},
    new { guid = @"[0-9|a-z|\-]{36}", locale = @"[a-z|A-Z]{2}-[A-Z|a-z]{2}"}
);

routes.MapRoute(
    "XBLContentDetails",
    "XBLContent/Details/{guid}",
    new { controller = "XBLContent", action = "Details" },
    new { guid = @"[0-9|a-z|\-]{36}" }
);


routes.MapRoute(
    "XBLContentDaysLocale",
    "XBLContent/{days}/{locale}",
    new { controller = "XBLContent", action = "Index" },
    new { days = @"[0-9]", locale = @"[a-z|A-Z]{2}-[A-Z|a-z]{2}" }
);

routes.MapRoute(
    "XBLContentDays",
    "XBLContent/{days}",
    new { controller = "XBLContent", action = "Index" },
    new { days = @"[0-9]" }
);

routes.MapRoute(
    "FeedRouteFull",
    "Feed/{action}/{sort}/{locale}",
    new { controller = "Feed", action = "GameAddons" },
    new { sort = @"[a-z|A-Z]+", locale = @"[a-z|A-Z]{2}-[A-Z|a-z]{2}" }
);

routes.MapRoute(
    "FeedRouteSort",
    "Feed/{action}/{sort}",
    new { controller = "Feed", action = "GameAddons", sort = UrlParameter.Optional },
    new { sort = @"[a-z|A-Z]+" }
);

routes.MapRoute(
    "FeedRoute",
    "Feed/{action}",
    new { controller = "Feed", action = "Index" }
);

routes.MapRoute(
    "Locale",
    "{locale}",
    new { controller = "Home", action = "Index" },
    new { locale = @"[a-z|A-Z]{2}-[A-Z|a-z]{2}" }
);

routes.MapRoute(
    "ControllerLocale",
    "{controller}/{locale}",
    new { controller = "Home", action = "Index", locale = UrlParameter.Optional },
    new { locale = @"[a-z|A-Z]{2}-[A-Z|a-z]{2}" }
);

routes.MapRoute(
    "ControllerActionLocale",
    "{controller}/{action}/{locale}",
    new { controller = "Home", action = "Index", locale = UrlParameter.Optional },
    new { locale = @"[a-z|A-Z]{2}-[A-Z|a-z]{2}" }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

UPDATE: I commented all the routes leaving only the default one, and the error still exists.

UPDATE: Here is the whole controller. Only changed the Arcade action and commented the "oldcode":

public class FeedController : Controller
{
    XBLContentContext db = new XBLContentContext();

    private int activemenu = 4;

    private const int QT_FEED = 12;

    public ActionResult Index(string locale)
    {
        if (String.IsNullOrEmpty(locale))
            locale = "en-us";


        ViewBag.Title = "Xbox LIVE Feeds";
        ViewBag.Description = "Xbox LIVE Feed generator. Configure and add it to your favourite feed reader.";
        ViewBag.Keywords = "xbox, live, tools, feed, syndication, rss, atom";

        ViewBag.ContentType = Enum.GetValues(typeof(ContentType)).Cast<ContentType>().Select(v => new SelectListItem
        {
            Selected = (v == ContentType.Arcade),
            Text = v.ToString().ToSentence(),
            Value = v.ToString()
        });
        ViewBag.SortBy = Enum.GetValues(typeof(SortBy)).Cast<SortBy>().Select(v => new SelectListItem
        {
            Selected = (v == SortBy.OfferStartDate),
            Text = v.ToString().ToSentence(),
            Value = v.ToString()
        });

        ViewBag.Regions = (from x in GlobalVariables.Regions
                           select new SelectListItem
                           {
                               Selected = (x.ID.ToLower() == locale),
                               Text = x.Country,
                               Value = x.ID.ToLower()
                           }).OrderBy(x => x.Text).ToList();

        return View();
    }

    public ActionResult AllDownloads(string sort, string locale)
    {
        var today = DateTime.Today;
        var region = "All Regions";

        var qry = from c in db.XBLRegionalContents.Include("Region").Include("Content")
                  where c.PublishDate <= today
                  select c;

        var qry2 = from c in qry
                   group c by c.ContentId into grouped
                   let maxdate = grouped.Max(x => x.PublishDate)
                   select new
                   {
                       Key = grouped.Where(x => x.ContentId == grouped.Key && (x.PublishDate == maxdate)).FirstOrDefault(),
                       Value = grouped.Where(x => x.ContentId == grouped.Key).Select(x => x.Region)
                   };

        if (!String.IsNullOrEmpty(locale))
            qry2 = from c in qry2
                   where c.Value.Any(x => x.ID == locale)
                   select c;

        var model = qry2.OrderByDescending(x => x.Key.PublishDate).Take(QT_FEED).ToDictionary(x => x.Key, x => x.Value);

        if (!String.IsNullOrEmpty(locale) && model.Count() > 0)
            region = model.FirstOrDefault().Key.Region.CountryEnglish;

        ViewBag.Language = locale;
        ViewBag.FeedTitle = "XBLTOOLS - Latest Content";
        ViewBag.FeedDescription = String.Format("{0} - {1}", region, DateTime.Now);

        return View("GlobalFeed", model);
    }

    public ActionResult FullGames(string sort, string locale)
    {
        var today = DateTime.Today;
        var region = "All Regions";

        var indie = ContentType.IndieGames.ToString();
        var qry = from c in db.XBLRegionalContents.Include("Region").Include("Content")
                  where c.Content.RelatedGameId == null && c.Content.FileSize > 0
                  && c.PublishDate <= DateTime.Today
                  && c.Content.ContentType != indie
                  select c;

        var qry2 = from c in qry
                   group c by c.ContentId into grouped
                   select new
                   {
                       Key = grouped.Where(x => x.ContentId == grouped.Key).FirstOrDefault(),
                       Value = grouped.Where(x => x.ContentId == grouped.Key).Select(x => x.Region)
                   };

        if (!String.IsNullOrEmpty(locale))
            qry2 = from c in qry2
                   where c.Value.Any(x => x.ID == locale)
                   select c;

        var model = qry2.OrderByDescending(x => x.Key.PublishDate).Take(QT_FEED).ToDictionary(x => x.Key, x => x.Value);

        if (!String.IsNullOrEmpty(locale) && model.Count > 0)
            region = model.FirstOrDefault().Key.Region.CountryEnglish;

        ViewBag.Language = locale;
        ViewBag.FeedTitle = "XBLTOOLS - Full Games";
        ViewBag.FeedDescription = String.Format("{0} - {1}", region, DateTime.Now);

        return View("GlobalFeed", model);
    }

    public ActionResult Arcade(string sort, string locale)
    {
        var page = db.XBLPages.First(x => x.Type == (int)XBLPageType.List);
        using (XBLPageCrawler crawler = new XBLPageCrawler(page, ContentType.Arcade, DownloadType.Game, sort,  locale))
        {
            var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
            ViewBag.Language = locale;
            ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, crawler.CType.GetDescription());

            return View("Feed", crawler.PageContent);
        }
        #region OLDCODE
        //    using (XBLChart p = new XBLChart(ContentType.Arcade, DownloadType.Game, sort, locale))
        //    {
        //        var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
        //        ViewBag.Language = locale;
        //        ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, p.CType.GetDescription());

        //        return View("Feed", p.ListaRegional);
        //    } 
        #endregion
    }

    public ActionResult GamesOnDemand(string sort, string locale)
    {
        using (XBLChart p = new XBLChart(ContentType.GamesOnDemand, DownloadType.Game, sort, locale))
        {
            var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
            ViewBag.Language = locale;
            ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, p.CType.GetDescription());

            return View("Feed", p.ListaRegional);
        }
    }

    public ActionResult IndieGames(string sort, string locale)
    {
        using (XBLChart p = new XBLChart(ContentType.IndieGames, DownloadType.Game, sort, locale))
        {
            var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
            ViewBag.Language = locale;
            ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, p.CType.GetDescription());

            return View("Feed", p.ListaRegional);
        }
    }

    public ActionResult GameDemos(string sort, string locale)
    {
        using (XBLChart p = new XBLChart(ContentType.GameDemos, DownloadType.GameDemo, sort, locale))
        {
            var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
            ViewBag.Language = locale;
            ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, p.CType.GetDescription());

            return View("Feed", p.ListaRegional);
        }
    }

    public ActionResult GameAddons(string sort, string locale)
    {
        using (XBLChart p = new XBLChart(ContentType.GameAddons, DownloadType.GameAddon, sort, locale))
        {
            var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
            ViewBag.Language = locale;
            ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, p.CType.GetDescription());

            return View("Feed", p.ListaRegional);
        }
    }

    public ActionResult GameVideos(string sort, string locale)
    {
        using (XBLChart p = new XBLChart(ContentType.GameVideos, DownloadType.GameVideo, sort, locale))
        {
            var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
            ViewBag.Language = locale;
            ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, p.CType.GetDescription());

            return View("Feed", p.ListaRegional);
        }
    }

    public ActionResult ThemesAndGamerPic(string sort, string locale)
    {
        using (XBLChart p = new XBLChart(ContentType.ThemesAndGamerPic, DownloadType.ThemesAndGamerPic, sort, locale))
        {
            var countrycode = String.IsNullOrEmpty(locale) ? String.Empty : String.Format("{0} - ", locale.Split('-')[1].ToUpper());
            ViewBag.Language = locale;
            ViewBag.FeedTitle = String.Format("{0}{1}", countrycode, p.CType.GetDescription());

            return View("Feed", p.ListaRegional);
        }
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

UPDATE Changed the Index action to Config and it works. Seems like the problem is with the default implicit "Index", because explicit /Feed/Index works too.

Maybe your routes need the following route adding?

routes.MapRoute(
  "Feed",
  "{controller}/{action}/{id}",
  new { controller = "Feed", action = "Index", id = UrlParameter.Optional }
);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM