Question Comment persistez-vous à interroger les valeurs dans asp.net mvc?


Quel est le bon moyen de persister les valeurs de chaîne de requête dans asp.net mvc?

Si j'ai une URL: / questions? page = 2 & sort = nouveautés & items = 50 & showcomments = 1 & search = abcd

Sur les liens de pagination, je veux conserver ces valeurs de chaîne de requête dans tous les liens pour qu'ils persistent lorsque l'utilisateur clique sur la "page suivante" par exemple (dans ce cas la valeur de la page changerait, mais le reste resterait le même)

Je peux penser à 2 façons de le faire:

  1. Request.Querystring dans la vue et ajoute les valeurs aux liens
  2. Renvoyez chaque valeur de chaîne de requête du contrôleur dans la vue à l'aide de ViewData

Est-ce que l'un est meilleur que l'autre? Est-ce que ce sont les seules options ou existe-t-il un meilleur moyen de le faire?


12
2018-05-20 19:19


origine


Réponses:


Je traiterais le QueryString dans la vue (votre option n ° 1), au lieu de le transmettre depuis le contrôleur. Cette approche rend la vue plus autonome, ce qui vous permet de la convertir en contrôle de vue et de la réutiliser dans différentes vues.

Remarque: L'accès au QueryString directement dans la vue peut sembler une violation du principe de conception consistant à séparer le modèle et la vue, mais en réalité, ces données sont un problème de navigation lié à la vue, qui ne fait pas vraiment partie du modèle.


6
2018-05-20 20:57



J'utilise une méthode d'extension pour cela:

public static string RouteLinkWithExtraValues(
        this HtmlHelper htmlHelper,
        string name,
        object values)
    {
        var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values);

        var extraValues = new RouteValueDictionary(values);
        foreach (var val in extraValues)
        {
            if (!routeValues.ContainsKey(val.Key))
                routeValues.Add(val.Key, val.Value);
            else
                routeValues[val.Key] = val.Value;
        }

        foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form)
        {
            routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key];
        }

        foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString)
        {
            if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "")
                routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key];
        }

        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);

        return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name);
    }

8
2018-05-20 20:24



Je voudrais juste garder les valeurs dans la session comme les liens de pagination doivent seulement avoir;

/ questions? page = 2

/ questions? page = 3

La seule raison pour laquelle je ne voudrais pas que le QueryString soit parce que je ne veux pas que l’utilisateur voit les valeurs que je transmets au programme. Il est trop facile pour eux d’entrer dans la barre d’adresse et de changer les valeurs pour «voir ce qui se passe». Avec ce code, tout ce qu’ils peuvent faire, c’est changer le numéro de page.


1
2018-05-20 20:07



Voici comment je l'ai fait dans Asp.Net Core, assignez d'abord les paramètres de chaîne de requête à ViewBags dans votre contrôleur:

[HttpGet("/[controller]/[action]/{categoryId?}/{contractTypeId?}/{locationId?}")]
public IActionResult Index(Guid categoryId, int contractTypeId, Guid locationId)
{
    ViewBag.CategoryId = categoryId;
    ViewBag.ContractTypeId = contractTypeId;
    ViewBag.LocationId = locationId;

    ...
}

Puis transmettez les valeurs à vos liens comme suit:

<a asp-action="Index" asp-controller="Jobs"
   asp-route-categoryId="@teachingCategory.Id"
   asp-route-contractTypeId="@ViewBag.ContractTypeId"
   asp-route-locationId="@ViewBag.LocationId">
   @teachingCategory.Description (@teachingCategory.Rank)
</a>

<a asp-action="Index" asp-controller="Jobs"
   asp-route-categoryId="@ViewBag.CategoryId"
   asp-route-contractTypeId="@typeOfEmployment.Id"
   asp-route-locationId="@ViewBag.LocationId">
   @typeOfEmployment.Name
</a>

<a asp-action="Index" asp-controller="Jobs"
   asp-route-categoryId="@ViewBag.CategoryId"
   asp-route-contractTypeId="@ViewBag.ContractTypeId"
   asp-route-locationId="@item.Id">
   @item.Id
</a>

Notez que chaque lien conserve sa propre valeur réelle et transmet le reste des valeurs de routage via ce que nous avons transmis à ViewBag.


0
2018-03-01 13:34