Como repetir a mesma ação ASP.NET MVC novamente?
-
21-08-2019 - |
Pergunta
Eu tenho uma ação chamada lista que mostra os resultados de uma pesquisa. Ele recebe parâmetros através da querystring porque eles são opcionais. Meu método de assinatura esta aparência:
public ActionResult List(List<int> categoryIDs, string school, int? stateID, int? page)
CategoryIDs é uma caixa de seleção múltipla e estou fazendo tudo sobre um pedido GET. O que eu preciso fazer é criar um link na minha opinião para a próxima página, mas mantêm os mesmos parâmetros de busca. Eu sei que eu posso construir a ligação à mão, mas é possível usar qualquer um dos built-in método de roteamento especialmente quando os CategoryIDs tem que ser formatado como "? CategoryID = 1 & categoryID = 2 & categoryID = 3" em ficar vinculado à lista / p>
Solução
Eu acho que não há nenhuma sobrecarga ActionLink
que ajuda você a fazer isso por padrão. Você precisa preencher a instância RouteValueDictionary
com os parâmetros que deseja incluir.
Para a lista de categoria, tente s / t como categoryIDs=2,3,4,5
etc. desde chaves de repetição não são permitidos em RouteValueDictionary
. Depois disso, no método de ação terá que analisar a cadeia para a lista inteira.
Outras dicas
Você deve ser capaz de fazer isso:
Todos os valores atuais devem ser passados ??por padrão. Eu teria que experimentá-lo embora para se certificar de que eu estou fazendo referência a sobrecarga correta.
Eu gosto de passar um objeto como um parâmetro para procurar ações e, em seguida, passar o objeto parâmetro para a vista. Assim, com algum código em seu controlador como este (nota que eu estou usando classe PagedList de Rob Conery ):
public class SearchParameters {
public string School { get; set; }
public int? StateID { get; set; }
public int? Page { get; set; }
public SearchParameters GetPage(int page) {
return new SearchParameters {
School = School,
StateID = StateID,
Page = page
};
}
}
public class SearchViewModel {
public PagedList<[YourResultType]> Results { get; set; }
public SearchParameters Parameters { get; set; }
}
// ...
public ActionResult Search(SearchParameters parameters) {
IQueryable<[YourResultType]> query;
// ... do some stuff to get your search results
return View("Search", new SearchViewModel {
Results = query.ToPagedList(parameters.Page - 1), 15),
Parameters = parameters
});
}
Assim, seus Search View herda do ViewPage genérica
<%@ Page ... Inherits="ViewPage<SearchViewModel>" %>
Então, na sua opinião busca, você pode fazer algo assim ...
<% for(int i = 0; i < Model.Results.TotalPages; i++) { %>
<%= Html.ActionLink(i + 1).ToString(), "Search",
Model.Parameters.GetPage(i + 1)) %>
<% } %>