2017-10-11 2 views
1

J'ai actuellement une vue qui renvoie une collection IEnumerable de techniciens via le TechnicianViewModel. Le modèle de vue se remplit correctement et affiche les objets correctement.Comment obtenir la vue pour renvoyer l'ID via un ViewModel au contrôleur?

Cependant, en ce moment j'ai besoin de quelqu'un pour me diriger dans la bonne direction en ce qui concerne la sélection d'un technicien spécifique.

Si je devais cliquer sur More Info sur le technicien, une requête [HttpGet] serait lancée, ce qui entraînerait un queryString. Et c'est exactement ce qui est contre les exigences de ce projet (exigences du projet: aucune chaîne de requête doit apparaître dans l'URL)

Voici la vue: -.

@model IEnumerable<ActionAugerMVC.ViewModels.TechnicianViewModel> 
    <div class="row"> 
     @foreach (var item in Model) 
     { 
      <div class="col-sm-6 col-md-3"> 
       <div class=""> 
        <div class=""> 
         <div class=""> 
          @item.UserName 
         </div> 
         <div class=""> 
          Technician 
         </div> 
        </div> 
        <div class=""> 
         <img src="~\[email protected]()" class="img-responsive" alt="..."> 
        </div> 
        <div class=""> 
         <p class="overlay__desc"> 
          @item.Bio 
         </p> 
         <ul class="overlay__social"> 
          <li><a href="#"><i class="ion-social-twitter"></i></a></li> 
          <li><a href="#"><i class="ion-social-facebook"></i></a></li> 
          <li><a href="#"><i class="ion-social-skype"></i></a></li> 
          <li><a href="#"><i class="ion-social-whatsapp-outline"></i></a></li> 
         </ul> 
         <a href="@Url.Action("Profile","Technician",new { url = item.GenerateURL() })" class="btn btn-accent">More info</a> 


        </div> 
       </div> 
      </div> 
     } 
     </div> <!--/.row --> 

Voici la vue Modèle : -

public class TechnicianViewModel 
{ 
public Guid ID { get; set; } 
public string UserName { get; set; } 
public string Bio { get; set; } 
public string GenerateName() 
{ 
    string str = GenerateURL(); 
    str = str + ".jpg"; 
    return str; 
} 
public string GenerateURL() 
{ 
    string phrase = string.Format("{0}", UserName); 
    string str = phrase.ToLower(); 
    str = Regex.Replace(str, @"\s", "-"); 
    return str; 
} 
} 

Comment puis-je éviter ma méthode de commande étant un [HttpGet] comme je l'avais mis en œuvre ici pour que je puisse avoir l'ID de l'objet viewmodel retourné par la vue.

 [HttpGet] 
    [Route("technician/profile/calgary-{url}")] 
    public IActionResult Profile(Guid? ID,string url) 
    { 
     var Profile = unitOfWork.TechnicianRepository.GetByGuidId(ID); 
     return View(Profile); 
    } 
+0

si vous voulez accéder aux propriétés du modèle sans les envoyer comme routevalue, vous devrez poster le formulaire avec un élément soumettre, ou effectuer le soumettre via jquery. – akerra

+0

@akerra Donc je dois changer le lien 'a' qui contient actuellement' Url.Action' à un bouton de formulaire? –

+0

Oui, je recommanderais quelque chose comme ' Plus d'infos' Cependant, vous aurez besoin d'un moyen de savoir quel technicien a été sélectionné, donc vous aurez probablement besoin de Définissez la valeur d'un div masqué sur l'ID du technicien sélectionné et liez-le à un nouveau champ de modèle. – akerra

Répondre

0

Dans votre vue, modifiez le lien qui suit:

<a href="@Url.Action("Profile","Technician",new { id = item.ID.ToString() })" class="btn btn-accent">More info</a> 

Vous pouvez vous débarrasser des décorateurs HttpGet et la route sur votre méthode de commande. Ceux-ci seront pris en charge par la configuration de routage par défaut:

public ActionResult Profile(string id) 
{ 
    TempData["guid"] = id; 
    return RedirectToAction("Profile"); 
} 

public ActionResult Profile() 
{ 
    Guid guid = Guid.Parse(TempData["guid"]); 
    var Profile = unitOfWork.TechnicianRepository.GetByGuidId(guid); 
    return View(Profile); 
} 
+0

Est-ce que cela empêchera l'ID d'apparaître dans l'URL? –

+0

Pourquoi ne voulez-vous pas l'ID dans l'URL? –

+0

essayez le ci-dessus qui utilise TempData pour passer le guid tout en nettoyant l'URL – akerra