使用javascript动态URL管理

时间:2009-08-25 12:31:30

标签: javascript asp.net-mvc url

我有一个搜索页面,允许用户根据特定集合中的条件进一步过滤他们的结果。

您可以通过搜索“标记”中的所有项目来开始搜索。为此创建的URL看起来像

搜索/索引?标签= TAGA

在页面上有一个标签列表,这些标签也在此结果集中。

我想要的是这个标签列表中生成的URL是

<a href="search/index?tag=TagA,TagB">TagB</a>

仅仅添加其他参数(例如页码和其他搜索条件)(仅为了简洁而未包含它们)仅仅附加到URL上是不够的。

我知道我可能在服务器端攻击这个,但没有什么感觉非常优雅,我想知道是否有一个整洁的解决方案。

这一切都是在ASP MVC中完成的,因此我有一个很好的简单局部视图来列出这些标签:

<%if(Model.Count()>0){ %>    
    <ul>
    <%foreach(Tag t in Model){ %>
        <li><%=t.name%></li>
    <%} %>
    </ul> 
<%} %

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这不是好看的代码,但它可能会给你一个想法:

  public static string CurrentUrl
        (this UrlHelper helper)
    {
        return GenerateUrl
            (helper, GetParameters(helper), null, null);
    }

    public static string CurrentUrlWith
        (this UrlHelper helper, string key, string value)
    {
        return GenerateUrl
            (helper, GetParameters(helper), key, value);
    }



 private static Dictionary<string, object> GetParameters
            (UrlHelper helper)
        {
            var context = helper.RequestContext.HttpContext;
            var request = context.Request;
            var parameters = new Dictionary<string, object>();
            request.Form.CopyTo(parameters);
            request.QueryString.CopyTo(parameters);

            return parameters;
        }

        //TODO: refactor
        private static string GenerateUrl
            (UrlHelper helper, Dictionary<string, object> parameters,
             string key, string value)
        {
            var context = helper.RequestContext.HttpContext;
            var request = context.Request;
            string query = "?",
                   url = request.FilePath;

            foreach (var parameter in parameters)
                if (parameter.Key != key)
                    query += string.Format("&{0}={1}",
                        helper.Encode(parameter.Key), 
                        helper.Encode(parameter.Value.ToString()));

            if (key != null && value != null)
                query += string.Format("&{0}={1}", helper.Encode(key), helper.Encode(value));

            if (query.Length > 1)
                query = query.Remove(1, 1);

            return url + query;
        }

用法如下:

<a href="<%= Url.CurrentUrlWith("page", (Model.TotalPages).ToString())%>" 
    class="p-last">Last page</a>

如果您想要涉及javascript,可能需要查看this jQuery plugin