The newly introduced nameof
operator is useful in making my code my "typed".
Instead of
return RedirectToAction("Edit");
we can write
return RedirectToAction(nameof(Edit));
But for to get a controller's name is not that straightforward, because we have a Controller
suffix. Just want to know if I want to have a
return RedirectToAction(nameof(Index), controllernameof(Home));
to take the place of
return RedirectToAction("Index", "Home");
how can we implement the controllernameof
operator?
A nameof expression produces the name of a variable, type, or member as the string constant: C# Copy.
A controller is responsible for controlling the way that a user interacts with an MVC application. A controller contains the flow control logic for an ASP.NET MVC application. A controller determines what response to send back to a user when a user makes a browser request.
Maybe an extension method like the following would suit your needs:
public static class ControllerExtensions
{
public static string ControllerName(this Type controllerType)
{
Type baseType = typeof(Controller);
if (baseType.IsAssignableFrom(controllerType))
{
int lastControllerIndex = controllerType.Name.LastIndexOf("Controller");
if (lastControllerIndex > 0)
{
return controllerType.Name.Substring(0, lastControllerIndex);
}
}
return controllerType.Name;
}
}
Which you could invoke like so:
return RedirectToAction(nameof(Index), typeof(HomeController).ControllerName());
No, there is no such possibility. You might be intertested to use T4MVC
instead.
T4MVC
- a T4 template forASP.NET MVC
apps that creates strongly typed helpers that eliminate the use of literal strings in many places.e.g. instead of
@Html.ActionLink("Dinner Details", "Details", "Dinners", new { id = Model.DinnerID }, null)
T4MVC
lets you write@Html.ActionLink("Dinner Details", MVC.Dinners.Details(Model.DinnerID))
Totally understand your desire to not use magic strings! Between the comments above and this article. I've started using the following in a base controller which my other controllers inherit from:
public RedirectToRouteResult RedirectToAction<TController>(Expression<Func<TController, string>> expression, object routeValues)
{
if (!(expression.Body is ConstantExpression constant))
{
throw new ArgumentException("Expression must be a constant expression.");
}
string controllerName = typeof(TController).Name;
controllerName = controllerName.Substring(0, controllerName.LastIndexOf("Controller"));
return RedirectToAction(constant.Value.ToString(), controllerName, routeValues);
}
public RedirectToRouteResult RedirectToAction<TController>(Expression<Func<TController, string>> expression)
{
return RedirectToAction(expression, null);
}
I then use :
return RedirectToAction<HomeController>(a => nameof(a.Index));
and
return RedirectToAction<HomeController>(a => nameof(a.Index), new { text= "searchtext" });
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