2010-06-13 2 views
1

Je dois être en mesure de fournir une page pour l'utilisateur final où Thay peut rechercher dans les domaines suivants:Comment rechercher avec des paramètres dans MVC?

  • travaux de recherche
  • Catégorie
  • Prix
  • AdType
  • Lieu

et ainsi de suite.

Il est important que l'utilisateur puisse copier l'URL et l'utiliser ensuite (et obtenir les mêmes paramètres). Il est également important d'être en mesure de sauvegarder ces paramètres sur l'utilisateur dans la base de données.

Jusqu'ici j'ai créé une classe ModelView qui contient les paramètres mais je ne suis pas sûr que c'est la bonne voie à suivre? Maby je devrais passer tout inte l'URL.

Si oui, comment j'accomplis cela? Y a-t-il des échantillons que je pourrais regarder?

BestRegards

Répondre

3

Le moins de façon problématique est de transmettre les paramètres dans la chaîne de requête.

mysite.com/search/?c=1&p=1.00&at=blah&location=75081&..... 

Il n'y a rien de non-MVC à propos de cette approche. En fait, vous pouvez voir ActionLinks généré en utilisant les paramètres QueryString lors de la transmission de paramètres qui ne correspondent pas aux champs du modèle.

Vous pouvez créer un itinéraire comme

Search/{Category}/{Price}/{AdType}/{Location}/... 

mais, à mon avis, qui est la mauvaise façon d'aller. Je suppose, peut-être incorrectement, que l'utilisation d'un itinéraire rendrait l'URL plus conviviale pour les moteurs de recherche, mais cela ne pose problème que si vous souhaitez que différentes combinaisons d'URL de recherche soient détectables par un moteur de recherche externe. sens comme un sitemap.

Mise à jour:

Si vous déclarez votre action comme ceci:

public ActionResult Search(string category, float price, string adType, float location) 
{ 
/// do whatever you want in here 
} 

Ensuite, vos paramètres de queryString seront mis en correspondance avec les paramètres de la méthode d'action.

Tout ce que vous aurez besoin de faire est de définir votre « méthode » formulaire GET,

<form method="GET" ....> 

pour obtenir vos champs passés comme paramètres de chaîne de requête au lieu de données de formulaire POST.

+0

Donc ce que vous dites, c'est que je construirais un peu de queryString sur submit qui prend tous mes paramètres en compte. Ensuite, sur le côté serveur, je vais extraire le quaryString et le valider par rapport aux injections d'injection. Lorsque cela est valide, je suis en mesure de renvoyer les bonnes données au client? Dois-je utiliser un queryString et inclure uniquement les paramètres choisis ou devrais-je aller avec l'itinéraire? Et comment puis-je construire la chaîne de requête aussi facile que possible? – Banshee

+0

Si vous définissez votre méthode de formulaire sur "GET", vos champs de formulaire seront transmis en tant que paramètres queryString au lieu des données POST. Vous devrez valider vos données sur le serveur dans votre méthode d'action. Si vous recherchez une base de données, utilisez une procédure stockée pour effectuer la recherche et une bonne bibliothèque, telle que la bibliothèque d'entreprise, pour appeler la procédure stockée, car cela vous protégera contre l'injection. Voir le updat ci-dessus. –

+0

Merci, mais cela signifie-t-il que je vais devoir générer la chaîne de requête manuellement sur le client sur submit dans un certain sens de la fonction javascript? Avez-vous maby a un exemple sur la façon de générer cette chaîne de requête? – Banshee

0

Désolé mais le champ de commentaire est trop petit pour être utilisé.

Le problème est que mon webmethod ressemble à ceci:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult List(AdList adList) 
     { 
      try 
      { 
       return View(adList); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

Le AdList ressemble à ceci:

public class AdList 
    { 
     public AdList() 
     { 
      this.ModelViewAd = new List<ModelViewAdList>(); 
     } 

     public List<ModelViewAdList> ModelViewAd { get; set; } 
     public SeartchParameters ModelViewSeartchParameters { get; set; } 
    } 

Et voici comment les membres ressemble:

public class SeartchParameters 
    { 
     public string SeartchString { get; set; } 
     public int CategoryId { get; set; } 
     public int MunicipalityId { get; set; } 
     public int CountryId { get; set; } 
    } 
    public class ModelViewAdList 
    { 
     [DisplayName("Titel")] 
     public string Titel { get; set; } 

     [DisplayName("Köp ny pris")] 
     public Decimal BuyNowPrice { get; set; } 

     [DisplayName("Reservations pris")] 
     public Decimal ReservationPrice { get; set; } 

     [Required(ErrorMessage = "Annons text saknas")] 
     [DisplayName("Annons text")] 
     public string Description { get; set; } 

     [DisplayName("Slutdatum")] 
     public DateTime? EndDate { get; set; } 

     [DisplayName("Frakt kostnad")] 
     public Decimal Shipping { get; set; } 

     [DisplayName("Produktens Skick")] 
     public ProductStatus StateOfProduct { get; set; } 

     [DisplayName("Start pris")] 
     public Decimal StartingPrice { get; set; } 

     [DisplayName("Annonstyp")] 
     public RadioButtonListViewModel<AdType> TypeOfAd { get; set; } 
    } 

Si je supprime le composant AdList en tant qu'inparamètre, j'adjecte les paramètres Seartch à la place. ne fonctionnera probablement pas becourse MVC essaie de renvoyer beaucoup d'objets?

Alors comment résoudre ceci en combinaison avec l'exemple de David?