新引入的nameof
运算符可以使我的代码成为“打字”。
而不是
return RedirectToAction("Edit");
我们可以写
return RedirectToAction(nameof(Edit));
但是要获得控制器的名称并不是那么简单,因为我们有一个Controller
后缀。只想知道我是否想要
return RedirectToAction(nameof(Index), controllernameof(Home));
取代
return RedirectToAction("Index", "Home");
我们如何实施controllernameof
运营商?
答案 0 :(得分:4)
不,没有这种可能性。您可能会使用T4MVC
代替。
T4MVC
-ASP.NET MVC
个应用的T4模板,用于创建强类型助手,可以在许多地方消除文字字符串的使用。e.g。而不是
@Html.ActionLink("Dinner Details", "Details", "Dinners", new { id = Model.DinnerID }, null)
T4MVC
让你写@Html.ActionLink("Dinner Details", MVC.Dinners.Details(Model.DinnerID))
答案 1 :(得分:3)
也许像下面这样的扩展方法可以满足您的需求:
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;
}
}
您可以这样调用:
return RedirectToAction(nameof(Index), typeof(HomeController).ControllerName());
答案 2 :(得分:1)
解决XControllerController案例的解决方案看起来更像:
ini_set('display_errors',1);
error_reporting(E_ALL);
答案 3 :(得分:0)
完全了解您不使用魔术弦的愿望!在以上注释和this article之间。我已经开始在其他控制器继承的基本控制器中使用以下内容:
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);
}
然后我使用:
return RedirectToAction<HomeController>(a => nameof(a.Index));
和
return RedirectToAction<HomeController>(a => nameof(a.Index), new { text= "searchtext" });
答案 4 :(得分:0)
public class BaseController : Controller
{
public RedirectToRouteResult RedirectToAction<T>(string ActionName, object routeValues) where T : BaseController
{
string controllerName = typeof(T).Name;
controllerName = controllerName.Substring(0, controllerName.LastIndexOf("Controller"));
return RedirectToAction(ActionName, controllerName, routeValues);
}
public RedirectToRouteResult RedirectToAction<T>(string ActionName) where T : BaseController
{
return RedirectToAction<T>(ActionName, null);
}
}
return RedirectToAction<AccountController>(nameof(AccountController.Login));
return RedirectToAction<AccountController>(nameof(AccountController.Login),new { text= "searchtext" });
剃须刀页面的扩展名
public static string ControllerName(this string controllerName)
{
return controllerName.Substring(0, controllerName.LastIndexOf("Controller"));
}
nameof(AccountController).ControllerName()