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

时间:2012-03-01 16:53:24

标签: asp.net-mvc dynamic razor named-parameters routevalues

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

@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>
}

现在假设我在上面的帮助器中使用了这个自定义@Html.ActionLink帮助器:

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

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

现在我得到这样一个链接:

http://leniel-pc:8083/realty/search?sectionName=Volta%20Redonda

应该是:

http://leniel-pc:8083/realty/search?City=Volta%20Redonda

City或我作为参数而不是sectionName传递的任何内容,因为“City”是我传递给辅助方法的参数sectionName的值。

我可以为sectionName进行切换,但我只是想知道是否有更简洁的方法来实现这一目标。

2 个答案:

答案 0 :(得分:5)

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

var values = new RouteValueDictionary();
values["somedynamicname"] = "some dynamic value";
values["someotherdynamicname"] = "some other dynamic value";

然后:

@Html.ActionLinkWithQueryString(fv.Range, "Search", values);

由于您说这是内部使用ActionLink的扩展方法,因此ActionLink的重载会将RouteValueDictionary而不是匿名对象作为路由参数。

由于RouteValueDictionary有一个带IDictionary<string, object>的构造函数,因此可以很容易地使用模型中的LINQ构建它。

答案 1 :(得分:0)

请尝试以下解决方案:

var routeValueDictionary = new RouteValueDictionary("");
routeValueDictionary.Add("keyName",value);
// Add any item you want!
@html.ActionLink("LinkName", "ActionName", "ControllerName",
routeValueDictionary , new{@class="form-control"})