Переполнение (то есть строка запроса) RouteData обратно из контроллера в представление

Кто-нибудь понимает, почему следующее не работает?

Что я хочу сделать, так это скопировать текущие данные маршрута плюс все, что я добавляю через анонимный объект, в новые данные маршрута при формировании новых ссылок в представлении.

Например, если у меня есть параметр «страница» в качестве пути без маршрута (т.е. он переполняет путь маршрута и вводится в параметр метода, если присутствует строка запроса), например.

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

Я разместил код только для иллюстрации. Это не работает и кажется неправильным... Указатели?


person Community    schedule 24.09.2008    source источник


Ответы (1)


Передать информацию о странице в ViewData?

PagedResultsInfo (или что-то в этом роде) звучит как класс, который вы тоже могли бы написать... да.

person Matt Hinze    schedule 24.09.2008