如何在包含点的 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