puf*_*pio 24 c# arrays asp.net-mvc list asp.net-mvc-routing
如果我有这样的动作:
public ActionResult DoStuff(List<string> stuff)
{
...
ViewData["stuff"] = stuff;
...
return View();
}
Run Code Online (Sandbox Code Playgroud)
我可以使用以下URL点击它:
http://mymvcapp.com/controller/DoStuff?stuff=hello&stuff=world&stuff=foo&stuff=bar
Run Code Online (Sandbox Code Playgroud)
但在我的ViewPage中,我有这个代码:
<%= Html.ActionLink("click here", "DoMoreStuff", "MoreStuffController", new { stuff = ViewData["stuff"] }, null) %>
Run Code Online (Sandbox Code Playgroud)
不幸的是,MVC不够聪明,无法识别该动作采用数组,并展开列表以形成正确的URL路由.相反,它只是在对象上执行.ToString(),它只列出了List中的数据类型.
当目标Action的参数之一是数组或列表时,有没有办法让Html.ActionLink生成正确的URL?
- 编辑 -
正如Josh在下面指出的那样,ViewData ["stuff"]只是一个对象.我试图简化问题,但引起了一个无关的错误!我实际上使用的是专用的ViewPage <T>,因此我有一个紧密耦合的类型感知模型.ActionLink实际上看起来像:
<%= Html.ActionLink("click here", "DoMoreStuff", "MoreStuffController", new { stuff = ViewData.Model.Stuff }, null) %>
Run Code Online (Sandbox Code Playgroud)
其中ViewData.Model.Stuff被键入为List
tva*_*son 20
我认为自定义的HtmlHelper是有序的.
public static string ActionLinkWithList( this HtmlHelper helper, string text, string action, string controller, object routeData, object htmlAttributes )
{
var urlHelper = new UrlHelper( helper.ViewContext.RequestContext );
string href = urlHelper.Action( action, controller );
if (routeData != null)
{
RouteValueDictionary rv = new RouteValueDictionary( routeData );
List<string> urlParameters = new List<string>();
foreach (var key in rv.Keys)
{
object value = rv[key];
if (value is IEnumerable && !(value is string))
{
int i = 0;
foreach (object val in (IEnumerable)value)
{
urlParameters.Add( string.Format( "{0}[{2}]={1}", key, val, i ));
++i;
}
}
else if (value != null)
{
urlParameters.Add( string.Format( "{0}={1}", key, value ) );
}
}
string paramString = string.Join( "&", urlParameters.ToArray() ); // ToArray not needed in 4.0
if (!string.IsNullOrEmpty( paramString ))
{
href += "?" + paramString;
}
}
TagBuilder builder = new TagBuilder( "a" );
builder.Attributes.Add("href",href);
builder.MergeAttributes( new RouteValueDictionary( htmlAttributes ) );
builder.SetInnerText( text );
return builder.ToString( TagRenderMode.Normal );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14349 次 |
| 最近记录: |