如何仅使用URL中的参数创建MVC路由

时间:2017-08-18 20:34:15

标签: c# asp.net-mvc-5

如何创建只有一个参数的路线?

示例:想要打电话

  

//网址:localhost:43760/NameMyProduct

我的路线是:

routes.MapRoute(
               name: "RouteEvent",
               url: "{productName}",
               defaults: new { controller = "Product", action = "Details", ProductName= UrlParameter.Optional }
           );

但是,此模式不起作用,我的返回是404。

我的观点是:
// HomeController

[Route("/{productName}")]
public ActionResult Index(string productName)
{
    return View();
}

或(我也在尝试)
// ProductController

[Route("/{productName}")]
    public ActionResult Details(string productName)
    {
        return View("Details", productName);
    }

2 个答案:

答案 0 :(得分:1)

您可以在控制器中的操作方法中使用Route属性。

您可以使用静态操作这样的名称来执行此操作:

[Route("/NameMyProduct")]
public IActionResult Index()
{
    // Your code here
}

这将解决:

URL: localhost:43760/NameMyProduct

或者您可以在路线

中使用实际产品名称
[Route("/{productName}")]
public IActionResult Index(string productName)
{
    // You can use product name to get the product details
    // I would actually use product id instead, it depends on what you need        
    return View("ProductDetails", productName);
}

这适用于:

URL: localhost:43760/NameMyProduct1
URL: localhost:43760/NameMyProduct2
URL: localhost:43760/OtherProductName
URL: localhost:43760/Product%20Name%20123 -- With spaces encoded

建议使用产品ID ,如下所示:

[Route("/Product/{productId}")]
public IActionResult Index(string productId)
{
    // Your code here to fetch the product details and return the view
    ProductViewModel product = GetProduct(productId);
    return View("ProductDetails", product);
}

这适用于:

URL: localhost:43760/Product/12345

答案 1 :(得分:0)

我可以这样做。

要解决此问题,我们必须在特定路线中创建Constraint。 此Constraint必须使用单个参数验证网址以确定哪个 使用路线。

示例:

public class ProductConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
           return !Assembly.GetAssembly(typeof(MvcApplication))
                .GetTypes().Where(type => typeof(Controller).IsAssignableFrom(type))
                .Any(c => c.Name.Replace("Controller", "") == values[parameterName].ToString());
        }
    }

我的路线是这样的:(此路线必须先在routeconig.cs defaultRoute中声明;

routes.MapRoute(
    name: "RouteProduct",
    url: "{ProductName}",
    defaults: new
    {
        controller = "Procuct",
        action = "Detalhe"
    },
    constraints: new { ProductName = new ProductConstraint() }
);

ProductName与Controller相同时可能会出错。所以,想想也许你必须对待它。 (一个好主意是在创建的Constraint处理。

我希望我有所帮助。