C#中的MVC控制器是否有nameof()运算符?

时间:2016-04-14 14:09:05

标签: c# asp.net-mvc

新引入的nameof运算符可以使我的代码成为“打字”。

而不是

return RedirectToAction("Edit");

我们可以写

return RedirectToAction(nameof(Edit));

但是要获得控制器的名称并不是那么简单,因为我们有一个Controller后缀。只想知道我是否想要

return RedirectToAction(nameof(Index), controllernameof(Home));

取代

return RedirectToAction("Index", "Home");

我们如何实施controllernameof运营商?

5 个答案:

答案 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)

基于Jon Ryananswer

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()