如何创建只有一个参数的路线?
示例:想要打电话
//网址:
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);
}
答案 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
处理。
我希望我有所帮助。