Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Net MVC提供了许多常量来处理控制器/操作重定向_C#_Asp.net Mvc_Constants - Fatal编程技术网

C# Net MVC提供了许多常量来处理控制器/操作重定向

C# Net MVC提供了许多常量来处理控制器/操作重定向,c#,asp.net-mvc,constants,C#,Asp.net Mvc,Constants,我们必须使用大量常量来处理跨不同控制器从一个动作到另一个动作的重定向,这是我还是其他人对此感到恼火。我曾试图实现一种基于反射的方法来解决这个问题,但我想知道其他人是如何处理这个问题的(当然,如果您认为这是一个问题的话:) 作为一个例子,我所做的是实现类似这样的东西来获得一个动作名称 public static string ActionName(Func<ActionResult> methodContainer) { return met

我们必须使用大量常量来处理跨不同控制器从一个动作到另一个动作的重定向,这是我还是其他人对此感到恼火。我曾试图实现一种基于反射的方法来解决这个问题,但我想知道其他人是如何处理这个问题的(当然,如果您认为这是一个问题的话:)

作为一个例子,我所做的是实现类似这样的东西来获得一个动作名称

  public static string ActionName(Func<ActionResult> methodContainer)
        {
            return methodContainer.Method.Name;
        }
公共静态字符串ActionName(Func methodContainer)
{
返回methodContainer.Method.Name;
}
要获取控制器名称

   public static string ControllerName<T>() where T : class
        {
            Type t = typeof (T);
            return t.Name.Replace(ControllerConstants.Controller, string.Empty);
        }
公共静态字符串ControllerName(),其中T:class
{
类型t=类型(t);
返回t.Name.Replace(ControllerConstants.Controller,string.Empty);
}
还有比这更好的方法吗


/大黄蜂

我会认真地看一看大黄蜂及其行动。它更好地解决了这个问题。此外,作者非常乐于助人,反应迅速


希望这对您有所帮助

查看MVCContrib库,下面的链接正好解决了您正在处理的问题……它从MVC v1开始就一直存在

它也在nuget上,所以它应该很容易旋转


您的动作名称提取方法根本不正确。如果对操作使用
ActionName
属性,则方法将返回错误的操作名称。如果您想消除字符串的使用并减少常量的编写,请尝试。它只会消除在asp.net mvc中写入常量的所有需要。它会自动为控制器名称、视图名称、操作名称等生成常量。

虽然我同意您应该在可用时使用支持的库,而不是滚动自己的库,但我认为值得分享的是,实现RedirectToAction实际上有很大的进步。下面的代码当然不完整,但总体思路是正确的,可以用来将许多基于反射的逻辑转换为类型安全逻辑

string ActionLink<TController, T>(Expression<Func<TController,T>> actionExpression, bool useQueryString = false)
        {
            var controllerName = typeof(T).Name;
            const string controllerPostfix = "Controller";
            if (controllerName.EndsWith(controllerPostfix, StringComparison.InvariantCultureIgnoreCase))
            {
                controllerName = controllerName.Substring(0, controllerName.Length - controllerPostfix.Length);
            }
            var expBody = (MethodCallExpression)actionExpression.Body;
            var method = expBody.Method;
            var parameters = method.GetParameters().ToArray();
            var arguments = string.Empty;
            if (useQueryString){
                arguments = GetQuerystring(expBody, parameters);
            } else{
                if (parameters.Length > 0)
                {
                    arguments = "/" + string.Join
                                            ("/",
                                             expBody.Arguments.Select
                                                 ((arg, i) => string.Format("{0}",GetValue(arg))).
                                                 ToArray());
                }

            }
            return "~/" + controllerName + "/" + expBody.Method.Name + arguments;
        }
string ActionLink(表达式actionExpression,bool-useQueryString=false)
{
var controllerName=typeof(T).Name;
const string controllerPostfix=“Controller”;
if(controllerName.EndsWith(controllerPostfix、StringComparison.InvariantCultureIgnoreCase))
{
controllerName=controllerName.Substring(0,controllerName.Length-controllerPostfix.Length);
}
var expBody=(MethodCallExpression)actionExpression.Body;
var method=expBody.method;
var parameters=method.GetParameters().ToArray();
var参数=string.Empty;
如果(使用QueryString){
参数=GetQuerystring(expBody,参数);
}否则{
如果(parameters.Length>0)
{
arguments=“/”+string.Join
("/",
expBody.Arguments.Select
((arg,i)=>string.Format(“{0}”,GetValue(arg)))。
ToArray());
}
}
返回“~/”+controllerName+“/”+expBody.Method.Name+参数;
}
正如我所说的,上述方法并不能处理所有的可能性(为了简洁起见,排除了使用的两种方法)。 并且没有错误处理,期望用户表现良好,但是上面的代码使编写代码成为可能

ACtionLink((MyController c=>c.ShowMeTheMoney(ThreatenWithGun:false,Shout:true))


可能,并将返回“~/My/ShowMeTheMoney/false/true”。因此,在需要时将类型安全表达式转换为字符串(或任何其他格式)不需要花费太多精力,而且所需的大部分内容可以在完全不同的场景之间重用(例如上面使用的GetValue方法,该方法能够遍历表达式树以获取该表达式树表示的值)

我知道,即使是单轨铁路也很不错。但是现在我们从微软那里得到了一些可靠的东西,我认为最好还是坚持下去,直到它被证明不是这样。所以,谢谢你的建议,但我想知道asp.net mvc;)是如何处理的我不知道为什么你说它不正确,但它工作正常-我只是想知道是否有更好的方法来实现这一点。我只是想这样做,以获得操作名称ControllerReflector.ActionName(索引);其中index是另一个动作方法。我认为字符串和常量是一样的——它们在编译时没有提供太多的控制来找出错误——这就是我尝试这样做的原因。看看类。默认动作调用程序使用这个属性。如果你的动作方法命名为view,但你得到了[ActionName(“Show”)],路由将使用名称“Show”作为操作名称。您的方法将返回“View”。“Show”!=“View”,因此您将遇到问题。我没有提到任何关于ActionNameAttribute的内容。实现完全基于“typed”东西。如果你现在不使用ActionNameAttribute,并不意味着你将来不会使用它。有些情况下,如果没有ActionNameAttribute,你就无法使用它,所以请考虑一下。好吧,那么我们再次陷入字符串和常量的同一问题。我看不到没有ActionN我们无法管理的情况ameAttribute,你能举个例子吗?谢谢你帮我弄明白这一点:)