Partage
  • Partager sur Facebook
  • Partager sur Twitter

@Html.ActionLink en ASP.NET MVC4

Sujet résolu
31 mai 2013 à 3:23:30

Bonjour tout le monde :)

je suis en train de réaliser une application ASP.NET MVC 4 (internet application)

j'ai une classe "UserProfile" que l’utilisateur peut y accéder pour voir et modifier son profil

voici la classe UserProfile:

    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string FirstName { get; set; }
        public string Address { get; set; }
        public int Phone { get; set; }
        public string Job { get; set; }
        public string Email { get; set; }


    }

le controller ProfileController:

namespace EmouwatenVI.Controllers
{
    public class ProfileController : Controller
    {
        private UsersContext db = new UsersContext();

        //
        // GET: /Profile/

        [Authorize]
        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: /Profile/Details/5

        public ActionResult Details(int id = 0)
        {
            UserProfile userprofile = db.UserProfiles.Find(id);
            if (userprofile == null)
            {
                return HttpNotFound();
            }
            return View(userprofile);
        }

        //
        // GET: /Profile/Edit/5

        public ActionResult Edit(int id = 0)
        {
            UserProfile userprofile = db.UserProfiles.Find(id);
            if (userprofile == null)
            {
                return HttpNotFound();
            }
            return View(userprofile);
        }

        //
        // POST: /Profile/Edit/5

        [HttpPost]
        public ActionResult Edit(UserProfile userprofile)
        {
            if (ModelState.IsValid)
            {
                db.Entry(userprofile).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(userprofile);
        }


        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}

et la vue Index:

@model EmouwatenVI.Models.UserProfile

@{
    ViewBag.Title = "Index";
    //public EmouwatenVI.Models.UsersContext db = new EmouwatenVI.Models.UsersContext();
}

<h2>Index</h2>

<fieldset>
    <legend>UserProfile</legend>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.UserName)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.UserName)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.FirstName)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.FirstName)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Address)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Address)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Phone)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Phone)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Job)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Job)
    </div>

    <div class="display-label">
         @Html.DisplayNameFor(model => model.Email)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.Email)
    </div>
</fieldset>
<p>
    
   @Html.ActionLink("Edition", "Edit", new {id=2 }

)
    
</p>

Problème 1: lorsque le membre est connecté la page d'index ne lui affiche pas ses propriétés (alors que je les ai remplis via SQL Server )

Problème2: pour le HTMLhelper, il n'est pas dynamique, j'ai essayé plusieurs versions mais pas de chance :(

un coup de main svp...



-
Edité par Sunnov 31 mai 2013 à 3:24:41

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 11:36:31

La vue dont tu donnes le code ici affiche les détails d'un utilisateur spécifique (celui désigné par Model): ça devrait donc être ta vue Details, pas ta vue Index. Ou alors il faut que tu charges un UserProfile dans l'action Index() de ton contrôleur (comme tu le fais dans son action Details()) et que tu le passes en tant que modèle de la vue. 

Ensuite je ne comprends pas ton 2eme problème: que veux-tu dire par "le HTMLhelper n'est pas dynamique" ? :o

-
Edité par Orwell 31 mai 2013 à 11:38:47

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 12:23:45

Tout d'abord merci pour votre réponse ^_^

puisque c'est un membre du site donc sa page d'index comprend ses détails (j'ai modifié la vue index en vue détails)

oui je sais que c'est pas dynamique ça concerne qu'un membre spécifique, mais lorsque je la rends dynamique c'est à dire je met

@Html.ActionLink("Edition", "Edit", new {id=Model.UserId})

ça marche pas et affiche le msg d'erreur suivant : la référence d'objet n'est pas définie à une instance d'un objet

Le HTMLhelper c'est bien le "@Html.ActionLink" j'ai dit que c'est pas dynamique c'est à dire que c'est pour un utilisateur bien spécifique.

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 12:26:22

OK, mais est-ce que tu charges correctement le bon UserProfile au moment d'afficher cette vue Index ?

Je pense que tes deux problèmes viennent de là, y compris l'erreur que tu obtiens en voulant utiliser ActionLink (car Model est null).

Edit: Sinon, une autre façon de faire serait de rediriger l'utilisateur vers l'Action Details lorsqu'il arrive sur la page d'accueil :

public ActionResult Index()
{
	return RedirectToAction("Details", new {id = [id du user courant]});
}

-
Edité par Orwell 31 mai 2013 à 12:30:00

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 12:52:13

J'ai saisi le problème, mais je ne savais pas la syntaxe pour mettre l'id du user courant???

-
Edité par Sunnov 31 mai 2013 à 12:52:45

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 12:59:16

Il faut que tu remplaces "[id du user courant]" par l'id de l'utilisateur courant dans le code que j'ai donné. Je ne sais pas ce que tu as mis en place pour identifier l'utilisateur connecté, donc je ne peux pas écrire ça à ta place. :)

-
Edité par Orwell 31 mai 2013 à 12:59:33

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 13:08:05

oui j'ai compris mais comment avoir l'id du user courant (je voulais dire la syntaxe)

j'ai chercher sur le net mais j'ai rien trouvé pour l'instant

-
Edité par Sunnov 31 mai 2013 à 13:09:32

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 15:27:34

Et bien, ça dépend : comment fais-tu actuellement pour initialiser la session d'un utilisateur qui s'authentifie ? Que fait l'action Login() (en POST) de ton controller de gestion de comptes (sans doute AccountController) ?

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 16:01:35

je viens de changer le code le l'action, il est comme suit:

        public ActionResult Index(UserProfile model)
        {
            int id = model.UserId;
            if(id == 0)
            {
                return HttpNotFound();
                
            }
            else
            {
                return RedirectToAction("Details", new { id });
            }

        }

et lorsque je débogue il me me renvois vers Erreur HTTP 404.0 - Not Found

et l'url est comme suit: http://localhost:2206/Profile/Details/0

comment il a eu l'id 0 ???

normalement je lui est demandé d'avoir l'id du user courant

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 16:47:51

C'est bon j'ai trouvé la solution, le code est comme suit:

        [Authorize]
        public ActionResult Index() 
        {
            UserProfile userprofile= db.UserProfiles.Single(p => p.UserName == User.Identity.Name);
            var id = userprofile.UserId;
            return RedirectToAction("Details", new { id });
        }

et merci énormément :)

  • Partager sur Facebook
  • Partager sur Twitter
31 mai 2013 à 17:50:38

Ca parait mieux en effet :) Note quand même que du coup, ta vue Index n'est jamais utilisée et est donc inutile.

De plus en faisant ça tu charges 2 fois le UserProfile correspondant à l'utilisateur connecté : une première fois pour avoir son id à partir de son username, et une seconde fois pour avoir le UserProfile à partir de l'id. Je te conseille plutôt d'écrire ton action comme ceci:

[Authorize]
public ActionResult Index()
{
	UserProfile userprofile = db.UserProfiles.Single(p => p.UserName == User.Identity.Name);
	return View("Details", userprofile); // affiche la vue "Details" avec le userprofile comme modèle
}

-
Edité par Orwell 31 mai 2013 à 17:53:30

  • Partager sur Facebook
  • Partager sur Twitter