Asp.net mvc 4 如何在包含点的ASP.NET MVC中实现自定义路由?

Asp.net mvc 4 如何在包含点的ASP.NET MVC中实现自定义路由?,asp.net-mvc-4,routes,Asp.net Mvc 4,Routes,而不是传统的MVC路线 {controller}/{action}/{id} 我需要我的系统来处理这样的请求 {controller}/{action}.{id} e、 g。 http://localhost:50691/epws/openWebViewer.x551 我无法控制呼叫我的系统 我修改了我的路线图 public class RouteConfig { public static void RegisterRoutes(RouteCollection r

而不是传统的MVC路线

{controller}/{action}/{id}
我需要我的系统来处理这样的请求

{controller}/{action}.{id}
e、 g。 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只返回一个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会破坏静态文件,但您可以调整regex以只匹配特定的参数名,例如openWebViewer