如何在包含点的 ASP.NET MVC 中实现自定义路由?
How to implement custom route in ASP.NET MVC containing dot?
代替
的常规MVC路由
{controller}/{action}/{id}
我需要我的系统来处理这样的请求
{controller}/{action}.{id}
例如
http://localhost:50691/epws/openWebViewer.x551
我无法控制呼叫我的系统
我修改了我的路由配置
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}.{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
使用以下控制器
public class epwsController : Controller
{
public ActionResult openWebViewer(string id)
{
return View(id);
}
}
但是上面的URL只是returns一个404
您可以执行如下操作,使用路由属性从 url 中删除操作参数。然后扩展 id 参数,因此字符串“openWebViewer.x551”作为一个整体进入操作内部,并在控制器内部进行一些内部路由。最后添加 web.config 设置以将尾部斜杠添加到 URL,这样它就不会被静态文件处理程序处理
控制器
using System;
using System.Web.Mvc;
namespace WebApplication8.Controllers
{
[RoutePrefix("epws")]
public class EpwsController : Controller
{
[Route("{id}")]
public ActionResult Index(string id)
{
var parameters = id.Split('.');
switch (parameters[0])
{
case "openWebViewer":
return openWebViewer(parameters[1]);
default:
throw new NotImplementedException();
}
}
public ActionResult openWebViewer(string id)
{
return View(id);
}
}
}
RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Web.config
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Add trailing slash for some URLs" stopProcessing="true">
<match url="^(.*(\.).+[^\/])$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" url="{R:1}/" />
</rule>
</rules>
</rewrite>
</system.webServer>
我相信这个 web.config 会破坏静态文件,但您可以调整正则表达式以仅匹配特定的参数名称,例如打开WebViewer
代替
的常规MVC路由{controller}/{action}/{id}
我需要我的系统来处理这样的请求
{controller}/{action}.{id}
例如 http://localhost:50691/epws/openWebViewer.x551
我无法控制呼叫我的系统
我修改了我的路由配置
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}.{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
使用以下控制器
public class epwsController : Controller
{
public ActionResult openWebViewer(string id)
{
return View(id);
}
}
但是上面的URL只是returns一个404
您可以执行如下操作,使用路由属性从 url 中删除操作参数。然后扩展 id 参数,因此字符串“openWebViewer.x551”作为一个整体进入操作内部,并在控制器内部进行一些内部路由。最后添加 web.config 设置以将尾部斜杠添加到 URL,这样它就不会被静态文件处理程序处理
控制器
using System;
using System.Web.Mvc;
namespace WebApplication8.Controllers
{
[RoutePrefix("epws")]
public class EpwsController : Controller
{
[Route("{id}")]
public ActionResult Index(string id)
{
var parameters = id.Split('.');
switch (parameters[0])
{
case "openWebViewer":
return openWebViewer(parameters[1]);
default:
throw new NotImplementedException();
}
}
public ActionResult openWebViewer(string id)
{
return View(id);
}
}
}
RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Web.config
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Add trailing slash for some URLs" stopProcessing="true">
<match url="^(.*(\.).+[^\/])$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" url="{R:1}/" />
</rule>
</rules>
</rewrite>
</system.webServer>
我相信这个 web.config 会破坏静态文件,但您可以调整正则表达式以仅匹配特定的参数名称,例如打开WebViewer