Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Asp.net mvc 3 在URL中使controllername可见,但不显示参数_Asp.net Mvc 3_Url_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc 3 在URL中使controllername可见,但不显示参数

Asp.net mvc 3 在URL中使controllername可见,但不显示参数,asp.net-mvc-3,url,asp.net-mvc-routing,Asp.net Mvc 3,Url,Asp.net Mvc Routing,有没有办法在MVC3中创建一个只包含控制器名称而不包含其参数的URL 我做了一个@url.Action(“Action”,“controller”,模型)我想让用户看到; “/controller/action”不是“/controller/action?…&&…” 我不知道该怎么做。您可以使用MVC contrlib。我做了类似的事情,不需要控制 public static class UrlExtensions { public static string Action<TCo

有没有办法在MVC3中创建一个只包含控制器名称而不包含其参数的URL 我做了一个
@url.Action(“Action”,“controller”,模型)
我想让用户看到; “/controller/action”不是“/controller/action?…&&…”
我不知道该怎么做。

您可以使用MVC contrlib。我做了类似的事情,不需要控制

public static class UrlExtensions
{
    public static string Action<TController>(this UrlHelper urlHelper, Expression<Action<TController>> expression) where TController : Controller
    {
        return BuildUrlFromExpression(urlHelper.RequestContext, urlHelper.RouteCollection, expression);
    }

    public static string ActionWithParameters<TController>(this UrlHelper urlHelper, Expression<Action<TController>> expression) where TController : Controller
    {
        return BuildUrlFromExpressionWithParameters(urlHelper.RequestContext, urlHelper.RouteCollection, expression);
    }

    public static RedirectToRouteResult Redirect<TController>(this TController controller, Expression<Action<TController>> expression) where TController : Controller
    {
        var valuesFromExpression = ExpressionHelper.GetRouteValuesFromExpressionWithParameters(expression);

        return new RedirectToRouteResult(valuesFromExpression);

    }

    private static string BuildUrlFromExpression<TController>(RequestContext context, RouteCollection routeCollection, Expression<Action<TController>> action) where TController : Controller
    {
        var valuesFromExpression = ExpressionHelper.GetRouteValuesFromExpression(action);
        var virtualPathForArea = RouteCollectionExtensions.GetVirtualPathForArea(routeCollection, context, valuesFromExpression);
        if (virtualPathForArea != null)
            return virtualPathForArea.VirtualPath;
        return null;
    }

    private static string BuildUrlFromExpressionWithParameters<TController>(RequestContext context, RouteCollection routeCollection, Expression<Action<TController>> action) where TController : Controller
    {
        var valuesFromExpression = ExpressionHelper.GetRouteValuesFromExpressionWithParameters(action);
        var virtualPathForArea = RouteCollectionExtensions.GetVirtualPathForArea(routeCollection, context, valuesFromExpression);
        if (virtualPathForArea != null)
            return virtualPathForArea.VirtualPath;
        return null;
    }
}

public static class ExpressionHelper
{
    public static RouteValueDictionary GetRouteValuesFromExpression<TController>(Expression<Action<TController>> action) where TController : Controller
    {
        MethodCallExpression call;
        return GetRouteValuesFromExpression(action, out call);
    }

    public static RouteValueDictionary GetRouteValuesFromExpressionWithParameters<TController>(Expression<Action<TController>> action) where TController : Controller
    {
        MethodCallExpression call;
        var rvd = GetRouteValuesFromExpression(action, out call);
        AddParameterValuesFromExpressionToDictionary(rvd, call);
        return rvd;
    }

    private static RouteValueDictionary GetRouteValuesFromExpression<TController>(Expression<Action<TController>> action, out MethodCallExpression call) where TController : Controller
    {
        if (action == null)
            throw new ArgumentNullException("action");
        call = action.Body as MethodCallExpression;
        if (call == null)
            throw new ArgumentException("MustBeMethodCall", "action");
        string name = typeof(TController).Name;
        if (!name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
            throw new ArgumentException("TargetMustEndInController", "action");
        string str = name.Substring(0, name.Length - "Controller".Length);
        if (str.Length == 0)
            throw new ArgumentException("CannotRouteToController", "action");
        string targetActionName = GetTargetActionName(call.Method);
        var rvd = new RouteValueDictionary();
        rvd.Add("Controller", (object)str);
        rvd.Add("Action", (object)targetActionName);
        var linkAreaAttribute = typeof(TController).GetCustomAttributes(typeof(ActionLinkAreaAttribute), true).FirstOrDefault() as ActionLinkAreaAttribute;
        if (linkAreaAttribute != null)
        {
            string area = linkAreaAttribute.Area;
            rvd.Add("Area", (object)area);
        }
        return rvd;
    }

    public static string GetInputName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
    {
        if (expression.Body.NodeType == ExpressionType.Call)
            return GetInputName((MethodCallExpression)expression.Body).Substring(expression.Parameters[0].Name.Length + 1);
        else
            return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
    }

    public static PropertyInfo GetPropertyInfo<TModel, TValue>(Expression<Func<TModel, TValue>> expression)
    {
        var member = expression.Body as MemberExpression;
        if (member == null)
            return null;
        var propInfo = member.Member as PropertyInfo;

        return propInfo;
    }


    private static string GetInputName(MethodCallExpression expression)
    {
        var expression1 = expression.Object as MethodCallExpression;
        if (expression1 != null)
            return GetInputName(expression1);
        else
            return expression.Object.ToString();
    }

    private static string GetTargetActionName(MethodInfo methodInfo)
    {
        if (methodInfo == null) throw new ArgumentNullException("methodInfo");
        var name = methodInfo.Name;
        if (methodInfo.IsDefined(typeof (NonActionAttribute), true))
        {
            throw new InvalidOperationException(string.Format(Helpers.MyFormat, "CannotCallNonAction {0}", name));
        }

        var actionNameAttribute = methodInfo.GetCustomAttributes(typeof (ActionNameAttribute), true).OfType<ActionNameAttribute>().FirstOrDefault();
        if (actionNameAttribute != null)
            return actionNameAttribute.Name;
        if (methodInfo.DeclaringType.IsSubclassOf(typeof (AsyncController)))
        {
            if (name.EndsWith("Async", StringComparison.OrdinalIgnoreCase))
                return name.Substring(0, name.Length - "Async".Length);
            if (name.EndsWith("Completed", StringComparison.OrdinalIgnoreCase))
                throw new InvalidOperationException(string.Format(Helpers.MyFormat, "CannotCallCompletedMethod: {0}", name));
        }
        return name;
    }

    private static void AddParameterValuesFromExpressionToDictionary(RouteValueDictionary rvd, MethodCallExpression call)
    {
        var parameters = call.Method.GetParameters();
        if (parameters.Length <= 0)
            return;
        for (int index = 0; index < parameters.Length; ++index)
        {
            var expression = call.Arguments[index];
            var constantExpression = expression as ConstantExpression;
            var obj = constantExpression == null ? CachedExpressionCompiler.Evaluate(expression) : constantExpression.Value;
            rvd.Add(parameters[index].Name, obj);
        }
    }
}
公共静态类URL扩展
{
公共静态字符串操作(此UrlHelper UrlHelper,表达式),其中TController:Controller
{
返回BuildUrlFromExpression(urlHelper.RequestContext,urlHelper.RouteCollection,expression);
}
公共静态字符串ActionWithParameters(此UrlHelper UrlHelper,表达式),其中TController:Controller
{
返回BuildUrlFromExpressionWithParameters(urlHelper.RequestContext,urlHelper.RouteCollection,expression);
}
公共静态重定向ToRouteResult重定向(此TController控制器,表达式),其中TController:controller
{
var valuesFromExpression=ExpressionHelper.GetRouteValuesFromExpressionWithParameters(表达式);
返回新的RedirectToRouteResult(ValuesFroExpression);
}
私有静态字符串BuildUrlFromExpression(RequestContext上下文、RouteCollection RouteCollection、Expression操作),其中TController:Controller
{
var valuesFromExpression=ExpressionHelper.GetRouteValuesFromExpression(操作);
var virtualPathForArea=RouteCollectionExtensions.GetVirtualPathForArea(routeCollection,context,ValuesFroExpression);
if(virtualPathForArea!=null)
返回VirtualPath for rea.VirtualPath;
返回null;
}
私有静态字符串BuildUrlFromExpressionWithParameters(RequestContext上下文、RouteCollection RouteCollection、Expression操作),其中TController:Controller
{
var valuesFromExpression=ExpressionHelper.GetRouteValuesFromExpressionWithParameters(操作);
var virtualPathForArea=RouteCollectionExtensions.GetVirtualPathForArea(routeCollection,context,ValuesFroExpression);
if(virtualPathForArea!=null)
返回VirtualPath for rea.VirtualPath;
返回null;
}
}
公共静态类ExpressionHelper
{
公共静态RouteValueDictionary GetRouteValuesFroExpression(表达式操作),其中TController:Controller
{
MethodCallExpression调用;
返回GetRouteValuesFroExpression(操作,out调用);
}
公共静态RouteValueDictionary GetRouteValuesFroExpressionWithParameters(表达式操作),其中TController:Controller
{
MethodCallExpression调用;
var rvd=getRouteValuesFroExpression(操作,输出调用);
AddParameterValuesFromexpressionDictionary(rvd,调用);
返回差饷物业估价署;
}
私有静态RouteValueDictionary GetRouteValuesFroExpression(表达式操作,out MethodCallExpression调用),其中TController:Controller
{
if(action==null)
抛出新的异常(“操作”);
call=action.Body作为MethodCallExpression;
if(call==null)
抛出新ArgumentException(“MustBeMethodCall”、“action”);
字符串名称=typeof(TController).name;
if(!name.EndsWith(“Controller”,StringComparison.OrdinalIgnoreCase))
抛出新的ArgumentException(“targetMustendInControl”,“操作”);
string str=name.Substring(0,name.Length—“Controller.Length”);
如果(str.Length==0)
抛出新的ArgumentException(“CannotRouteToController”、“action”);
字符串targetActionName=GetTargetActionName(call.Method);
var rvd=新的RouteValueDictionary();
rvd.添加(“控制器”、(对象)str);
rvd.添加(“动作”,“对象”targetActionName);
var linkAreaAttribute=typeof(TController).GetCustomAttributes(typeof(ActionLinkAreaAttribute),true.FirstOrDefault()作为ActionLinkAreaAttribute;
如果(linkAreaAttribute!=null)
{
字符串区域=linkAreaAttribute.area;
rvd.添加(“面积”,(对象)面积);
}
返回差饷物业估价署;
}
公共静态字符串GetInputName(表达式)
{
if(expression.Body.NodeType==ExpressionType.Call)
返回GetInputName((MethodCallExpression)expression.Body).Substring(expression.Parameters[0].Name.Length+1);
其他的
返回expression.Body.ToString().Substring(expression.Parameters[0].Name.Length+1);
}
公共静态属性信息GetPropertyInfo(表达式)
{
var member=expression.Body作为MemberExpression;
if(成员==null)
返回null;
var propInfo=member.member作为PropertyInfo;
返回propInfo;
}
私有静态字符串GetInputName(MethodCallExpression表达式)
{
var expression1=expression.Object作为MethodCallExpression;
if(表达式1!=null)
返回GetInputName(表达式1);
其他的
返回表达式.Object.ToString();
}
私有静态字符串GetTargetActionName(MethodInfo MethodInfo)
{
如果(methodInfo==null)抛出新的ArgumentNullException(“methodInfo”);
var name=methodInfo.name;
if(methodInfo.IsDefined(typeof(NonActionAttribute),true))
{
抛出新的InvalidOperationException(string.Format(Helpers.MyFormat,“CannotCallNoAction{0}”,name));
}
var actionNameAttribute=methodInfo.GetCustomAttributes(typeof(actionNameAttribute),true).OfType().FirstOrDefault();
if(actionNameAttribute!=null)
返回actionNameAttribute.Name;
if(methodInfo.DeclaringType.IsSubclassOf(typeof(AsyncController)))
{
if(name.EndsWith(“Async”,StringComparison.OrdinalIgnoreCase))
返回name.Substring(0,name.Length-
@(Url.Action<MyController>(x => x.MethodName(null, 0, 0)))