Asp.NetMVC 5路由没有命中控制器,而RouteDebugger在路由上说true和Breakpoints没有命
本文关键字:路由 true RouteDebugger Breakpoints 控制器 NetMVC Asp | 更新日期: 2023-09-27 18:28:22
你好,我遇到了一个问题,当使用route Debugger进行检查时,路由是正确的,它说它是正确的并且可以工作,但控制器没有被击中,代码上的断点在启动控制器时也不工作。
我在我的项目中使用区域,项目结构是:
区域
---管理员
--------控制器
------------------AdminArticle
------------------AdminHome
---web
控制器
----------主页
----------G文件控制器
----------文章G文件控制器
型号
------第条
------相册
------etc
我的路线代码:
using System.Web.Mvc;
using System.Web.Routing;
namespace Falestinona2016V1
{
public class RouteConfig {
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//HttpMethodConstraint GetFileMethodConstraints = new HttpMethodConstraint(new string[] { "GET" });
//Route GetFileRoute = new Route(
// url: "ArticleFilesManager/{UID}/{id}/{filename}",
// routeHandler: new DobImageRouteHandler(),
// defaults: null,
// constraints: new RouteValueDictionary { { "httpMethod", GetFileMethodConstraints } }
//);
//routes.Add("GetFileRoute", GetFileRoute);
routes.MapRoute(
name: "Delete File",
url: "ArticleFilesManager/{UID}/{id}/{filename}",
defaults: new { controller = "ArticleGFilesController", action = "Delete", area = "" },
constraints: new { httpMethod = new HttpMethodConstraint("DELETE") },
namespaces: new[] { "Falestinona2016V1.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
routes.MapRoute(
name: "Get Json File List ArticleFilesManager",
url: "ArticleFilesManager/{UID}",
defaults: new { controller = "ArticleGFilesController", action = "List", area = "", UID = UrlParameter.Optional },
constraints: new { httpMethod = new HttpMethodConstraint("GET") },
namespaces: new[] { "Falestinona2016V1.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
routes.MapRoute(
name: "PostArticleFilesUploadManager",
url: "ArticleFilesManager/{UID}",
defaults: new { controller = "ArticleGFilesController", action = "Uploads", area = "" },
constraints: new { httpMethod = new HttpMethodConstraint("POST") },
namespaces: new[] { "Falestinona2016V1.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
routes.MapRoute(
name: "ArticleFilesUploadManager",
url: "ArticleFilesManager/{UID}",
defaults: new { controller = "ArticleGFilesController", area = "" },
namespaces: new[] { "Falestinona2016V1.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "Falestinona2016V1.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;
}
}
}
我的GFilesController:
using Falestinona2016V1.GlobalObjects;
using Falestinona2016V1.GUtils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
namespace Falestinona2016V1.Controllers {
public class GFilesController : Controller {
protected string storageRoot;
public GFilesController() {
storageRoot = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppSettings.GUploadsFolder);
}
public GFilesController(string subFolderCategory) : this() {
storageRoot = Path.Combine(storageRoot, subFolderCategory + "''");
}
[AcceptVerbs(HttpVerbs.Delete)]
public ActionResult Delete(string id, string filename) {
if (id == null || filename == null) {
return HttpNotFound();
}
var filePath = Path.Combine(storageRoot, id + "-" + filename);
if (System.IO.File.Exists(filePath)) {
System.IO.File.Delete(filePath);
}
return RedirectToAction("Index", "Home");
}
public ActionResult Find(string id, string filename) {
if (id == null || filename == null) {
return HttpNotFound();
}
var filePath = Path.Combine(storageRoot, id + "-" + filename);
FileStreamResult result = new FileStreamResult(new FileStream(filePath, FileMode.Open), GetMimeType(filePath));
result.FileDownloadName = filename;
return result;
}
[HttpGet]
public virtual ActionResult List() {
var fileData = new List<ViewDataUploadFilesResult>();
DirectoryInfo dir = new DirectoryInfo(storageRoot);
if (dir.Exists) {
string[] extensions = MimeTypes.ImageMimeTypes.Keys.ToArray();
FileInfo[] files = dir.EnumerateFiles()
.Where(f => extensions.Contains(f.Extension.ToLower()))
.ToArray();
if (files.Length > 0) {
foreach (FileInfo file in files) {
var fileId = file.Name.Substring(0, 20);
var fileNameEncoded = HttpUtility.HtmlEncode(file.Name.Substring(21));
var relativePath = "/FilesUploading/" + fileId + "-" + fileNameEncoded;
fileData.Add(new ViewDataUploadFilesResult() {
url = relativePath,
thumbnail_url = relativePath, //@"data:image/png;base64," + EncodeFile(fullName),
name = fileNameEncoded,
type = MimeTypes.ImageMimeTypes[file.Extension],
size = Convert.ToInt32(file.Length),
delete_url = relativePath,
delete_type = "DELETE"
});
}
}
}
var serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
var result = new ContentResult {
Content = "{'"files'":" + serializer.Serialize(fileData) + "}",
};
return result;
}
[HttpPost]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Uploads() {
var fileData = new List<ViewDataUploadFilesResult>();
foreach (string file in Request.Files) {
UploadWholeFile(Request, fileData);
}
var serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
var result = new ContentResult {
Content = "{'"files'":" + serializer.Serialize(fileData) + "}",
};
return result;
}
protected virtual void UploadWholeFile(HttpRequestBase request, List<ViewDataUploadFilesResult> statuses) {
for (int i = 0; i < request.Files.Count; i++) {
HttpPostedFileBase file = request.Files[i];
var fileId = IDGen.NewID();
var fileName = Path.GetFileName(file.FileName);
var fileNameEncoded = HttpUtility.HtmlEncode(fileName);
var fullPath = Path.Combine(storageRoot, fileId + "-" + fileName);
file.SaveAs(fullPath);
statuses.Add(new ViewDataUploadFilesResult() {
url = "/Files/" + fileId + "-" + fileNameEncoded,
thumbnail_url = "/Files/" + fileId + "-" + fileNameEncoded, //@"data:image/png;base64," + EncodeFile(fullName),
name = fileNameEncoded,
type = file.ContentType,
size = file.ContentLength,
delete_url = "/Files/" + fileId + "-" + fileNameEncoded,
delete_type = "DELETE"
});
}
}
private string EncodeFile(string fileName) {
return Convert.ToBase64String(System.IO.File.ReadAllBytes(fileName));
}
private string GetMimeType(string filePath) {
return GetMimeType(new FileInfo(filePath));
}
private string GetMimeType(FileInfo file) {
return MimeTypes.ImageMimeTypes[file.Extension];
}
}
}
我的文章文件控制器:
using Falestinona2016V1.GUtils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
namespace Falestinona2016V1.Controllers {
public class ArticleGFilesController : GFilesController {
private string uid;
public ArticleGFilesController() : base("Articles") {
Guid tempGUID;
if (Guid.TryParse(RouteData.Values["UID"] as string, out tempGUID)) {
uid = tempGUID.ToString();
}
}
[HttpGet]
public override ActionResult List() {
return Content("Test");
try {
var fileData = new List<ViewDataUploadFilesResult>();
DirectoryInfo dir = new DirectoryInfo(Path.Combine(storageRoot, uid + "''"));
if (dir.Exists) {
string[] extensions = MimeTypes.ImageMimeTypes.Keys.ToArray();
FileInfo[] files = dir.EnumerateFiles()
.Where(f => extensions.Contains(f.Extension.ToLower()))
.ToArray();
if (files.Length > 0) {
foreach (FileInfo file in files) {
var fileId = file.Name.Substring(0, 20);
var fileNameEncoded = HttpUtility.HtmlEncode(file.Name.Substring(21));
//var relativePath = "/FilesUploading/" + fileId + "-" + fileNameEncoded;
var relativePath = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded);
fileData.Add(new ViewDataUploadFilesResult() {
url = relativePath,
thumbnail_url = relativePath, //@"data:image/png;base64," + EncodeFile(fullName),
name = fileNameEncoded,
type = MimeTypes.ImageMimeTypes[file.Extension],
size = Convert.ToInt32(file.Length),
delete_url = relativePath,
delete_type = "DELETE"
});
}
}
}
var serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
var result = new ContentResult {
Content = "{'"files'":" + serializer.Serialize(fileData) + "}",
};
return result;
}
catch (Exception ex) {
return Content(ex.ToString());
}
}
protected override void UploadWholeFile(HttpRequestBase request, List<ViewDataUploadFilesResult> statuses) {
for (int i = 0; i < request.Files.Count; i++) {
HttpPostedFileBase file = request.Files[i];
var fileId = IDGen.NewID();
var fileName = Path.GetFileName(file.FileName);
var fileNameEncoded = HttpUtility.HtmlEncode(fileName);
var fullPath = Path.Combine(storageRoot, uid, fileId + "-" + fileName);
file.SaveAs(fullPath);
statuses.Add(new ViewDataUploadFilesResult() {
//url = "/Files/" + fileId + "-" + fileNameEncoded,
url = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded),
thumbnail_url = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded), //@"data:image/png;base64," + EncodeFile(fullName),
name = fileNameEncoded,
type = file.ContentType,
size = file.ContentLength,
delete_url = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded),
delete_type = "DELETE"
});
}
}
}
}
我的家庭控制器:
using Falestinona2016V1.Areas.Admin;
using Falestinona2016V1.GlobalObjects;
using System.Web.Mvc;
namespace Falestinona2016V1.Controllers
{
public class HomeController : GController {
// GET: Home
public ActionResult Index() {
return RedirectToAction("Index", "AdminHome", new { area = new AdminAreaRegistration().AreaName });
}
}
}
我的区域-->管理员-->控制器-->AdminHomeController
using Falestinona2016V1.Areas.Admin.AdminGlobalObjects;
using System.Web.Mvc;
namespace Falestinona2016V1.Areas.Admin.Controllers
{
public class AdminHomeController : AdminGController {
// GET: Admin/AdminHome
public ActionResult Index() {
return View();
}
}
}
当我在url中时:域/admin/adminhome
我正在尝试输入url:domain/ArticleFilesManager/fdghdfgfgjgkjdfg但是ArticleGFilesController-->列表操作未命中同时还使用:domain/ArticleFilesManager/c7db4817-c4f5-41c9-ae5c-d12d2a2f1c
我无法解决问题,而路由调试器:
路由调试器结果图像
多亏了"rymling",解决方案是:从控制器名称中删除控制器部件:
defaults: new { controller = "ArticleGFiles",