[英]Is there a nameof() operator for MVC controllers in C#?
新引入的nameof
運算符有助於使我的代碼成為我的“類型”。
代替
return RedirectToAction("Edit");
我們可以寫
return RedirectToAction(nameof(Edit));
但是要獲取控制器的名稱並不是那么簡單,因為我們有一個Controller
后綴。 只是想知道我是否想要一個
return RedirectToAction(nameof(Index), controllernameof(Home));
代替
return RedirectToAction("Index", "Home");
我們如何實現controllernameof
運算符?
也許像下面這樣的擴展方法會滿足您的需求:
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());
不,沒有這種可能。 您可能會感興趣地改用T4MVC
。
T4MVC
- 用於ASP.NET MVC
應用程序的 T4 模板,它創建強類型幫助程序,在許多地方消除了文字字符串的使用。例如代替
@Html.ActionLink("Dinner Details", "Details", "Dinners", new { id = Model.DinnerID }, null)
T4MVC
讓你寫@Html.ActionLink("Dinner Details", MVC.Dinners.Details(Model.DinnerID))
完全理解你不想使用魔法字符串的願望! 在上面的評論和這篇文章之間。 我已經開始在我的其他控制器繼承的基本控制器中使用以下內容:
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" });
解決 XControllerController 案例的解決方案看起來更像是:
String nameStr = nameof(FlightControllerController);
nameStr = nameStr.Substring(0, nameStr.LastIndexOf("Controller"));
為了實現這種事情,我采用了@stephen.vakil 的答案,與@huysentruitw 的答案合並並寫下了這個:
namespace Helpers
{
public static class ControllerHelper
{
public static string Nameof<TController>() where TController : Controller
{
var name = typeof(TController).Name;
var indexOfControllerText = name.LastIndexOf("Controller");
if (indexOfControllerText > 0)
{
return name.Substring(0, indexOfControllerText);
}
return name;
}
}
}
要使用它,首先你必須添加“使用靜態”
using static Helpers.ControllerHelper;
然后像這樣在代碼中使用它
var controllerName = Nameof<TestController>();
在 C# 8 及更高版本中,您可以使用范圍運算符刪除最后 10 個字符:
nameof(AccountController)[..^10]
10 可以用常量代替,如果你不喜歡簡潔的話。
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()
基於@Trương Quốc Khánh的回答,我通過添加一些檢查修改了擴展方法:
public static class StringExtensions
{
public static string ControllerName(this string controllerName)
{
if (!controllerName.EndsWith("Controller") || controllerName == "Controller")
throw new ArgumentException($"{controllerName} is not a valid name for a Controller class");
return controllerName.Substring(0, controllerName.LastIndexOf("Controller"));
}
}
用法:
nameof(Controller).ControllerName()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.