使用Razor视图在路径值集合中动态命名参数

Len*_*rri 1 asp.net-mvc dynamic named-parameters routevalues razor

我使用辅助方法在视图中创建部分:

@helper CreateFacetSection(WebViewPage page, string sectionName,
                           List<FacetValue> model)
{
     var showMore = int.Parse(WebConfigurationManager.AppSettings["ShowMore"]);

     <section id="@sectionName">

     <h4>@sectionName</h4>

        <ul>
            @for (int i = 0; i < model.Count(); i++)
            {
                if (i >= showMore)
                {
                    @:<li class="hide">
                }
                else
                {
                    @:<li>
                }

                FacetValue fv = model.ElementAt(i);

                @page.Html.ActionLinkWithQueryString(fv.Range, "Search",
                                              new { sectionName = fv.Range }, null);

                @:(@fv.Count)

                @:</li >
            }
        </ul>   

        @if(model.Count > showMore)
        {
            <a href="#" class="show-more" data-section="@sectionName">
            @Localization.ShowMore &#9660;</a>
        }   

     </section>
}
Run Code Online (Sandbox Code Playgroud)

现在让我们说我@Html.ActionLink在上面的帮助器中使用了这个自定义助手:

 @Html.ActionLinkWithQueryString(fv.Range, "Search", new { sectionName = fv.Range });
Run Code Online (Sandbox Code Playgroud)

有没有办法在路由值集合中传递动态命名参数?在上面的例子中,我想要一个sectionName动态命名的参数,以便我在action方法中获得正确的值绑定.根据sectionName我目前作为辅助方法的参数传递,它会有所不同......

现在我得到这样的链接:

http://leniel-pc:8083/realty/search?sectionName=Volta%20Redonda
Run Code Online (Sandbox Code Playgroud)

它应该是:

http://leniel-pc:8083/realty/search?City=Volta%20Redonda
Run Code Online (Sandbox Code Playgroud)

City或者我作为参数传递的任何东西而不是sectionName因为"City"是sectionName我传递给辅助方法的参数的值.

我可以做一个转换,sectionName但我只是想知道是否有更简洁的方法来实现这一目标.

Dar*_*rov 5

您尚未显示ActionLinkWithQueryString自定义帮助程序的外观,但您可以添加一个重载,RouteValueDictionary而不是匿名对象.然后很容易:

var values = new RouteValueDictionary();
values["somedynamicname"] = "some dynamic value";
values["someotherdynamicname"] = "some other dynamic value";
Run Code Online (Sandbox Code Playgroud)

然后:

@Html.ActionLinkWithQueryString(fv.Range, "Search", values);
Run Code Online (Sandbox Code Playgroud)

既然你说,这是使用扩展方法ActionLink内部,也有重载ActionLink称取RouteValueDictionary的,而不是一个匿名对象作为参数路线.

而且由于RouteValueDictionary有一个构造函数IDictionary<string, object>可以很容易地使用模型中的LINQ来构建它.