2014-02-05 4 views
0

У меня есть простой метод действий, в котором перечислены некоторые данные из репозитория. Представление для этого действия использует простой пейджинг. URL можно нажать или ввести как server:port/product/2, где 2 - номер страницы. Если пользователь вводит номер страницы, который больше, чем количество страниц данных, я хочу сначала перенаправить пользователя на server:port/product/1 и сообщить им, что они были перенаправлены. Отправляющая часть работает, но я не могу найти способ получить значение, переданное методу действия.ASP.NET MVC уведомляет о перенаправлении с JavaScript

EDIT: Я использовал QueryString неправильно в этом вопросе, я действительно хочу, это параметр, переданный методу действия.

ProductController

public ActionResult List(int page =1) 
     { 
      ProductsListViewModel model = new ProductsListViewModel(); 
      model.Products = _repository.Products.OrderBy(x => x.ProductId) 
             .Skip((page -1) * 4) 
             .Take(4); 
      model.PagingInfo = new PagingInfo() 
      { 
       CurrentPage = page, 
       ItemsPerPage = 4, 
       TotalItems = _repository.Products.Count() 
      }; 
      //this correctly redirects 
      if (page > model.PagingInfo.TotalPages) 
      { 
       return RedirectToAction("List", new { page = 1 }); 
      } 
      return View(model); 
     } 

JavaScript

var pageParam = "@Request.QueryString["id"]" 
    var pageTotal = "@Model.PagingInfo.TotalPages"; 
    var pageCurrent ="@Model.PagingInfo.CurrentPage"; 
    console.log('this is the current page: ' + pageCurrent); 
    console.log(pageTotal); 
    console.log(pageParam); 

    function notifyRedirect(pageTotal, pageParam) { 
     if (pageParam > pageTotal) { 
      alert('you entered ' + pageParam + ', an invalid page parameter and were redirected'); 
      window.location = '/Product/List/1'; 
     } 
    } 
    notifyRedirect(pageTotal,pageParam); 

Маршруты

  routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional } 
      ); 

При загрузке страницы pageTotal и pageCurrent переменные выводятся на консоль, но я получаю пустую строку при попытке получить значение QueryString. Решив, что, возможно, у меня было имя параметра неправильно, я решил использовать интегральный показатель QueryString и был представлен с ошибкой:

Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 

Как это что http://localhost:49997/product/list/2, полностью квалифицированное URL по-прежнему дает мне пустое значение QueryString? Как я могу использовать JS для уведомления пользователя о перенаправлении?

+0

'QueryString' является частью URL-адреса, который появляется после"? " и состоит из «&» - разделенных пар «имя = значение» - у вас его нет – Igor

+0

@wootscootinboogie, вы хотите сначала сообщить, а затем перенаправить? или перенаправить сначала, а затем уведомить? Кажется, что ваш javascript делает - уведомлять и перенаправлять, но в вашем вопросе я вижу, что вы предупреждаете, а затем перенаправляете. – ramiramilu

+0

@ramiramilu Я бы хотел перенаправить, а затем уведомить. Я не знаю, чего мне не хватает, но даже с помощью Request ["id"] ничего мне не возвращает. Однако, если я использую Request.Url, я могу увидеть этот параметр как часть URL-адреса, но я не могу его удержать при использовании JS. – wootscootinboogie

ответ

1

Возможно, мне что-то не хватает, но похоже, что ваш вопрос: «Как получить строковое значение запроса из URL-адреса без строки запроса».

И ваш Перенаправление URL, /Product/List/1 и последний URL упоминалось, http://localhost:49997/product/list/2, нет строки запроса, поэтому любая попытка доступа ничего в Request.QueryString собирается возвращать нуль.

Если вам нужно что-то в строке запроса на редирект, то вам нужно добавить, что к перенаправлением URL:

window.location = '/Product/List/1' + ((pageParam != '') ? '?id=' + pageParam : ''); 
+0

Я сконфигурировал параметр, переданный методу действия, и строку запроса как одно и то же. То, что мне действительно нужно, - это параметр, который был передан методу действия. – wootscootinboogie

+0

Ну, этого не будет с помощью 'Request.QueryString'. Попробуйте просто 'Request ['page']' (так как @Igor отметил, что ваше действие принимает «страницу», а не «id»). –

1

Изменить имя параметра метода действия от page до id согласиться с MapRoute. Тогда вам не нужен первый MapRoute, если вы не пропустите имя действия в URL-адресе.

+0

Я тоже это пробовал. Как отмечено в редактировании, я действительно хочу, чтобы получить параметр, который был передан методу действия, а не строку запроса как таковую. – wootscootinboogie

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