我有一个返回一个数组(字符串[])的方法,我想这个字符串数组传递到操作链接,这样它会创建一个类似的查询字符串:
/Controller/Action?str=val1&str=val2&str=val3...etc
但是,当我经过新{海峡= GetStringArray()}我得到以下网址:
/Controller/Action?str=System.String%5B%5D
所以基本上它采取我的String [],并在其上运行的ToString()来获取值。
有任何想法吗? 谢谢!
Answer 1:
尝试创建一个RouteValueDictionary牵着你的价值观。 你必须给每个条目一个不同的密钥。
<% var rv = new RouteValueDictionary();
var strings = GetStringArray();
for (int i = 0; i < strings.Length; ++i)
{
rv["str[" + i + "]"] = strings[i];
}
%>
<%= Html.ActionLink( "Link", "Action", "Controller", rv, null ) %>
会给你像一个链接
<a href='/Controller/Action?str=val0&str=val1&...'>Link</a>
编辑 :MVC2改变ValueProvider界面,使我原来的答复过时。 您应该使用一个模型字符串数组作为属性。
public class Model
{
public string Str[] { get; set; }
}
然后模型粘结剂将填充您在URL值传递模型。
public ActionResult Action( Model model )
{
var str0 = model.Str[0];
}
Answer 2:
这真让我生气所以用斯科特Hanselman的启发我写了下面(流利)扩展方法:
public static RedirectToRouteResult WithRouteValue(
this RedirectToRouteResult result,
string key,
object value)
{
if (value == null)
throw new ArgumentException("value cannot be null");
result.RouteValues.Add(key, value);
return result;
}
public static RedirectToRouteResult WithRouteValue<T>(
this RedirectToRouteResult result,
string key,
IEnumerable<T> values)
{
if (result.RouteValues.Keys.Any(k => k.StartsWith(key + "[")))
throw new ArgumentException("Key already exists in collection");
if (values == null)
throw new ArgumentNullException("values cannot be null");
var valuesList = values.ToList();
for (int i = 0; i < valuesList.Count; i++)
{
result.RouteValues.Add(String.Format("{0}[{1}]", key, i), valuesList[i]);
}
return result;
}
调用像这样:
return this.RedirectToAction("Index", "Home")
.WithRouteValue("id", 1)
.WithRouteValue("list", new[] { 1, 2, 3 });
Answer 3:
刚刚来到我的脑海另一种解决方案:
string url = "/Controller/Action?iVal=5&str=" + string.Join("&str=", strArray);
这是肮脏的,你使用它之前测试它,但它仍然应该工作。 希望这可以帮助。
Answer 4:
有一个叫库Unbinder ,您可以使用插入复杂的物体进入路线/网址。
它的工作原理是这样的:
using Unbound;
Unbinder u = new Unbinder();
string url = Url.RouteUrl("routeName", new RouteValueDictionary(u.Unbind(YourComplexObject)));
Answer 5:
这是一个解决HelperExtension阵列和IEnumerable属性的麻烦:
public static class AjaxHelperExtensions
{
public static MvcHtmlString ActionLinkWithCollectionModel(this AjaxHelper ajaxHelper, string linkText, string actionName, object model, AjaxOptions ajaxOptions, IDictionary<string, object> htmlAttributes)
{
var rv = new RouteValueDictionary();
foreach (var property in model.GetType().GetProperties())
{
if (typeof(ICollection).IsAssignableFrom(property.PropertyType))
{
var s = ((IEnumerable<object>)property.GetValue(model));
if (s != null && s.Any())
{
var values = s.Select(p => p.ToString()).Where(p => !string.IsNullOrEmpty(p)).ToList();
for (var i = 0; i < values.Count(); i++)
rv.Add(string.Concat(property.Name, "[", i, "]"), values[i]);
}
}
else
{
var value = property.GetGetMethod().Invoke(model, null) == null ? "" : property.GetGetMethod().Invoke(model, null).ToString();
if (!string.IsNullOrEmpty(value))
rv.Add(property.Name, value);
}
}
return System.Web.Mvc.Ajax.AjaxExtensions.ActionLink(ajaxHelper, linkText, actionName, rv, ajaxOptions, htmlAttributes);
}
}
Answer 6:
我会使用POST的数组。 除了是丑陋和GET的滥用,你可能运行的URL空间(信不信由你)。
假设一个2000字节的限制 。 查询字符串开销(STR =)降低你〜300个字节的实际数据的(假设网址的其余部分是0字节)。
文章来源: ASP.NET MVC - Pass array object as a route value within Html.ActionLink(…)