i have a Action called Index in a controller. This can be called like the following:
I have a custom attribute which should be set to 2. and 3., but not to 1. So I tried the following:
public ActionResult Index() {
return View();
}
[MyCustomAttribute]
public ActionResult Index(StatusEnum status) {
return View();
}
[MyCustomAttribute]
public ActionResult Index(DateTime date) {
return View();
}
That seems not possible, I always get an error that Index is ambiguous. But I can't really understand why: The Actions have different parameters, so it should be no problem to distinguish them by the parameters.
When I try something like this, I get the same error:
public ActionResult Index() {
return View();
}
[MyCustomAttribute]
public ActionResult Index(StatusEnum status, DateTime date) {
return View();
}
In this case it should be REALLY clear and no problem to handle all requests without parameters to the first Action and the rest to the second one. I think this is very strange, because in native C# its definitely no problem to make such overloads.
The second point: When overloading is for whatever reason not possible, how can I handle that? Excluding the Index-Action without parameters (when possible) is no option because I use the attribute in other controllers too, and there should be all Index-Actions handled.
While overloading makes sense from a C# perspective, the MVC routing doesn't know how to deal with some overloads. You can get your overloads to work if you used typed parameters in Attribute Routing...
[Route("controller/action")]
public ActionResult Index() {
return View();
}
[MyCustomAttribute]
[Route("controller/action/{status:int}")]
public ActionResult Index(StatusEnum status) {
return View();
}
//
[MyCustomAttribute]
[Route("controller/action/{date:datetime}")]
public ActionResult Index(DateTime date) {
return View();
}
Add this line to RouteConfig.cs to enable Attribute Routing...
routes.MapMvcAttributeRoutes();
When I have this URL:
http://www.test.com/
Where do you think the route will take you? It can go in the Index()
action obviously but why shouldn't it be able to go to the Index(StatusEnum status, DateTime date)
action? Both parameters are nullable so they will just be null.
The point is that the routing engine won't know what you want, maybe you want to have null parameters, maybe not.
You can try something like this:
public ActionResult Index() {
return View();
}
[Route("SetStatus/{status}")]
public ActionResult Index(StatusEnum status) {
return View();
}
[Route("SetDate/{date}")]
public ActionResult Index(DateTime date) {
return View();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With