Кто-нибудь понимает, почему следующее не работает?
Что я хочу сделать, так это скопировать текущие данные маршрута плюс все, что я добавляю через анонимный объект, в новые данные маршрута при формировании новых ссылок в представлении.
Например, если у меня есть параметр «страница» в качестве пути без маршрута (т.е. он переполняет путь маршрута и вводится в параметр метода, если присутствует строка запроса), например.
public ActionResult ChangePage(int? page) { }
и я хочу, чтобы View знал обновленную страницу при построении ссылок с помощью помощников. Я подумал, что лучший способ сделать это со следующим:
public ActionResult ChangePage(int? page)
{
if(page.HasValue)
RouteData.Values.Add("Page", page);
ViewData.Model = GetData(page.HasValue ? page.Value : 1);
}
Затем в разметке представления я могу отобразить следующий, предварительный просмотр, сортировку, показать больше (любые соответствующие ссылки) с помощью этой перегрузки:
public static class Helpers
{
public static string ActionLinkFromRouteData(this HtmlHelper helper, string linkText, string actionName, object values)
{
RouteValueDictionary routeValueDictionary = new RouteValueDictionary();
foreach(var routeValue in helper.ViewContext.RouteData.Values)
{
if(routeValue.Key != "controller" && routeValue.Key != "action")
{
routeValueDictionary[routeValue.Key] = routeValue;
}
}
foreach(var prop in GetProperties(values))
{
routeValueDictionary[prop.Name] = prop.Value;
}
return helper.ActionLink(linkText, actionName, routeValueDictionary;
}
private static IEnumerable<PropertyValue> GetProperties(object o)
{
if (o != null) {
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(o);
foreach (PropertyDescriptor prop in props) {
object val = prop.GetValue(o);
if (val != null) {
yield return new PropertyValue { Name = prop.Name, Value = val };
}
}
}
}
private sealed class PropertyValue
{
public string Name { get; set; }
public object Value { get; set; }
}
}
Я разместил код только для иллюстрации. Это не работает и кажется неправильным... Указатели?