mvc中的GetVirtualPath方法

时间:2016-03-29 14:04:31

标签: asp.net-mvc asp.net-mvc-routing

任何人都可以解释虚拟路径的计算方式吗? 根据RouteData.Values或根据url模式?

我正在尝试删除一些routedata值,但虚拟路径仍然没有变化。 我有一个问题,虚拟路径在URL的开头返回冗余斜杠,如:/ he / controller / action文化之前的斜杠是多余的......

我正在使用以下

之类的自定义路线
    routes.Add("Default",
             new CustomRoute("{culture}/{controller}/{action}/{id}",
                 new
                 {
                     controller = "Desktop",
                     action = "Index",
                     culture = "he-IL",
                     guid = "",
                     id = UrlParameter.Optional
                 }));
  routes.Add("Wizard_" + wizard,
                        new CustomRoute("{guid}/{culture}/" + wizardName + "/{action}/{id}",
                        new
                        {
                            controller = wizard,
                            action = "Index",
                            culture = "he-IL",
                            guid = "",
                            id = UrlParameter.Optional
                        }));

问题是当使用Url.Action(action,controller)方法并且操作在向导控制器中时,操作的URL是向导格式,如{guid} / {culture} /“+ wizard +”/ {动作} / {ID} 如果guid值为空,则返回的URL为// he-il / controller / action 而不是/ he-il / controller / action

CustomRoute类:

public class CustomRoute : Route
{
    private List<string> _wizards;

    public CustomRoute(string uri, object defaults)
        : base(uri, new RouteValueDictionary(defaults), new MvcRouteHandler())
    {
        _wizards = new List<string>();
        FillWizards(ref _wizards);
        DataTokens = new RouteValueDictionary();
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        bool hasGuid = httpContext.Request.RequestContext.RouteData != null 
            && httpContext.Request.RequestContext.RouteData.Values != null 
            && httpContext.Request.RequestContext.RouteData.Values.ContainsKey("guid") 
            && !httpContext.Request.RequestContext.RouteData.Values["guid"].ToString().Equals(Guid.Empty);

        var routeData = base.GetRouteData(httpContext);
        if (routeData == null)
            return null;

        bool isWizard = _wizards.Contains(routeData.Values["controller"].ToString());
        Debug.WriteLine("Controller: " + routeData.Values["controller"] + " action: " + routeData.Values["action"] + " Is wizard: " + isWizard + " has guid: " + hasGuid);
        if (isWizard && !hasGuid)
        {
            if (string.IsNullOrEmpty(routeData.Values["guid"].ToString()))
            {
                routeData.Values["guid"] = Guid.NewGuid().ToString("N");
            }
        }

        return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData path;
        path = base.GetVirtualPath(requestContext, values);

        return path;
    }

    private void FillWizards(ref List<string> items)
    {
        var _configuration = ObjectFactory.GetInstance<IConfiguration>();
        List<string> wizards = _configuration.GetParamValue<string>("SessionUniqueWizards", "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();

        items = wizards;
    }
}

1 个答案:

答案 0 :(得分:0)

缺少guid参数的原因是

  1. 您对guid的调用中没有Url.Action(action, controller)参数。
  2. 当前请求中(显然)没有guid参数。也就是说,正在被击中的当前路线没有guid路线值。
  3. 您已指定guidguid = "")的默认值。由于空字符串是您指定为默认字符串的字符串,因此默认情况下为空字符串。
  4. 要正确构建网址,guid必须来自某个地方。构建外发网址时MVC always passes matching route values from the current request,但由于并非所有网址都有guid,您需要为上下文中不存在的网页指定网址:

    Url.Action("Index", "Search", new { guid = "a565f84f9152495792d433f5bd26000f")
    

    这是正常的做法。通常,如果要构建CRUD操作的链接,则需要在实体列表中进行。

    例如,对于Product实体,您通常会为列表中的每个Edit Product添加Delete ProductProduct的链接,如下所示:< / p>

    <tr>
        <td>model.ProductName</td>
        <td>@Html.ActionLink("Product", "Edit", new { guid = model.ProductId })</td>
        <td>@Html.ActionLink("Product", "Delete", new { guid = model.ProductId })</td>
    </tr>
    

    通常还会有一个链接来添加一个没有标识符的新实体。

    @Html.ActionLink("Product", "Add")
    

    但是从你的例子中不清楚一个&#34;向导&#34;将被创建。创建新标识符通常应该是Add方法的函数,而不是路由的函数。

    但似乎存在一个问题,即您在路由中随机生成GUID,因此不清楚您希望如何将此值从一个请求维护到下一个请求。