2017-02-03 12 views
2

В настоящее время я пишу свой собственный постраничный список для ASP.NET Core MVC.ASP.NET MVC - Создать строку ссылки сохранения действия

борется, создавая следующее:

Я хочу, чтобы создать метод расширения UrlHelper: Url.PageLink (INT страницы, внутр PAGESIZE)

В рамках этого метода расширения Я хочу, чтобы вернуть ссылку, которая повторно использует ВСЕ текущие значения для контроллера, действия, querystring и, кроме того, он должен добавлять/обновлять страницы, значения pageSize в querystring.

Вопросы: Откуда я могу получить текущий контроллер и действие в объекте UrlHelper? Каков наилучший способ перестроить запрос? Я вижу это здесь url.ActionContext.HttpContext.Request.QueryString ... но действительно ли мне нужно вручную его перестроить? Или что-то вроде AddQueryStringValue (int key, object value) существует?

Большое спасибо! Саймон

+0

Куда вы собираетесь использовать свой URL-адрес? Вам необходимо создать ViewModel, который содержит необходимую вам информацию. Почему вы используете Querystring? – Wheels73

+0

Мне нужен запрос, потому что я хочу, чтобы этот метод работал на любой вид. Я не хочу идти с определенной моделью просмотра. Я просто хочу создать метод расширения public static string PageLink (этот URL-адрес IUrlHelper, int page, int pageSize) – Simon

+0

Я вижу. Ну, сам QS - это всего лишь набор ключевых пар значений. Можете ли вы иметь это как параметр в вашем ext. метод? – Wheels73

ответ

1

Сделал это теперь так:

public static class UrlHelperExtensions 
{ 
    public static string Page(this IUrlHelper url, int page, int pageSize) 
    { 
     //Reuse existing route values 
     RouteValueDictionary resultRouteValues = new RouteValueDictionary(url.ActionContext.RouteData.Values); 

     //Add existing values from query string 
     foreach (var queryValue in url.ActionContext.HttpContext.Request.Query) 
     { 
      if(resultRouteValues.ContainsKey(queryValue.Key)) 
       continue; 

      resultRouteValues.Add(queryValue.Key, queryValue.Value); 
     } 

     //Set or add values for PagedList input model 
     resultRouteValues[nameof(PagedListInputModel.Page)] = page; 
     resultRouteValues[nameof(PagedListInputModel.PageSize)] = pageSize; 

     return url.RouteUrl(resultRouteValues); 
    } 
} 

И создал отдельную модель ввода «PagedListInputModel» для всего значения pagedlist ... Таким образом, я могу гарантировать, что я могу использовать его во всех местах и не обязательно, чтобы свойства страницы и pageSize были включены во все необходимые режимы просмотра с правильным именем.

Любая обратная связь приветствуется.

0

Улучшение ответа Саймона: Его можно назвать @Url.Current(new {page=42, id=5, foo=bar}) Он сохранит строку запроса и обновит/добавит предоставленные значения.

public static class UrlHelperExtensions 
    { 
     /// <summary> 
     /// Get current URL with substituted values while preserving query string 
     /// </summary> 
     /// <param name="helper"></param> 
     /// <param name="substitutes">Query string parameters or route data paremers. E.g. new { action="Index", sort = "asc"}</param> 
     /// <returns></returns> 
     public static string Current(this IUrlHelper helper, object substitutes) 
     { 
      RouteValueDictionary routeData = new RouteValueDictionary(helper.ActionContext.RouteData.Values); 
      IQueryCollection queryString = helper.ActionContext.HttpContext.Request.Query; 

      //add query string parameters to the route data 
      foreach (var param in queryString) 
      { 
       if (!string.IsNullOrEmpty(queryString[param.Key])) 
       { 
        //rd[param.Key] = qs[param.Value]; // does not assign the values! 
        routeData.Add(param.Key, param.Value); 
       } 
      } 

      // override parameters we're changing in the route data 
      //The unmatched parameters will be added as query string. 
      foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(substitutes.GetType())) 
      { 
       var value = property.GetValue(substitutes); 
       if (string.IsNullOrEmpty(value.ToString())) 
       { 
        routeData.Remove(property.Name); 
       } 
       else 
       { 
        routeData[property.Name] = value; 
       } 
      } 

      string url = helper.RouteUrl(routeData); 
      return url; 
     } 
    } 
0

Вопрос задает вопрос для Asp.Net Core. Я пытался использовать ответ shturm на MVC 5 и не мог заставить его работать. Я принял его те же самые понятия и изменил его для работы с MVC 5. Если кому-то нужна эта проверка, я публикую ее здесь. Я также добавил возможность изменить действие и контроллер.

/// <summary> 
    /// Get URL with substituted values while preserving query string. 
    /// </summary> 
    /// <param name="helper">The url helper object we are extending.</param> 
    /// <param name="action">The action we want to direct to.</param> 
    /// <param name="controller">The controller we want to direct to.</param> 
    /// <param name="substitutes">Query string parameters or route data paremers. E.g. new { action="Index", sort = "asc"}</param> 
    /// <returns>The route string.</returns> 
    public static String ActionWithOriginalQueryString(this UrlHelper helper, String action, String controller, object substitutes) 
    {    
     RouteValueDictionary routeData = new RouteValueDictionary(helper.RequestContext.RouteData.Values); 
     NameValueCollection queryString = helper.RequestContext.HttpContext.Request.QueryString; 

     //add query string parameters to the route data 
     foreach (var param in queryString.AllKeys) 
     { 
      if (!string.IsNullOrEmpty(queryString[param])) 
      { 
       //rd[param.Key] = qs[param.Value]; // does not assign the values! 
       routeData.Add(param, queryString[param]); 
      } 
     } 

     // override parameters we're changing in the route data 
     //The unmatched parameters will be added as query string. 
     foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(substitutes.GetType())) 
     { 
      var value = property.GetValue(substitutes); 
      if (string.IsNullOrEmpty(value?.ToString())) 
      { 
       routeData.Remove(property.Name); 
      } 
      else 
      { 
       routeData[property.Name] = value; 
      } 
     } 

     //Set the controller and the action. 
     routeData["controller"] = controller; 
     routeData["action"] = action; 

     //Return the route. 
     return helper.RouteUrl(routeData); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^