2016-05-16 14 views
0

Here is a picture how it lists all phone numbers from all users when I hover over the user account.Pass UserID Parameter in Foreach-Schleifen mit Popover Inhalt

Ich erstelle ein MVC-Projekt mit ASP.NET und Razor mit durch "@foreach (var Artikel in Model)" alle Benutzer in der Warteschlange. In dieser Tabelle möchte ich ein Popover verwenden, das die Telefonnummern des Benutzers anzeigt, die sich einmal über dem Namen des Accounts (Dealer genannt) befinden. Es listet derzeit alle Telefone aller Benutzer auf, aber ich möchte, dass sie für diesen Benutzer spezifisch sind. Ich habe versucht, ActionLinks (wie ich den gleichen Parameter für Bearbeiten, Details und Löschen übergeben) sowie Tags, aber beide scheinen nicht zu funktionieren. Wie kann ich den UserID-Parameter übergeben, um das Popover so zu beschränken, dass nur die Telefonnummern aufgelistet werden, die mit einem bestimmten Benutzer verknüpft sind?

Hier ist der Code für die Tabelle ist:

<table> 
@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Dealer) 
     </td> 
     <td> 
      <a href="#" data-toggle="popover" title="Phones">@Html.DisplayFor(modelItem => item.UserName)</a> 
      <div id="phone-content" style="display: none"> 
       @foreach (var phone in Model) 
       { 
        //Using ActionLinks 
        @Html.ActionLink("Mobile", "ListPhones", new { id = item.Id })<br /> 
        @Html.ActionLink("Business", "ListPhones", new { id = item.Id })<br /> 
        @Html.ActionLink("Fax", "ListPhones", new { id = item.Id })<br> 

        //Using <a href> tags 
        <a href="tel:@phone.PhoneMobile">@Html.DisplayFor(modelItem => phone.PhoneMobile)</a><br /> 
        <a href="tel:@phone.PhoneBus">@Html.DisplayFor(modelItem => phone.PhoneBus)</a><br /> 
        <a href="tel:@phone.PhoneFax">@Html.DisplayFor(modelItem => phone.PhoneFax)</a><br /> 
       } 
      </div> 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id = item.Id })<br /> 
      @Html.ActionLink("Details", "Details", new { id = item.Id })<br /> 
      @Html.ActionLink("Delete", "Delete", new { id = item.Id }) 
     </td> 
    </tr> 
} 
</table> 

In der Steuerung habe ich eine neue Klasse der Telefoninformationen und versucht, das Bestehen der Parameter dort aufzulisten. Hier ist der Code ein Benutzer in der Steuerung für die Bearbeitung, die korrekt den Parameter übergibt:

public async Task<ActionResult> Edit(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var user = await UserManager.FindByIdAsync(id); 
     if (user == null) 
     { 
      return HttpNotFound(); 
     } 

     var userRoles = await UserManager.GetRolesAsync(user.Id); 

     return View(new AdminEditUserViewModel() 
     { 
      Id = user.Id, 
      Dealer = user.Dealer, 
      UserName = user.UserName, 
      FirstName = user.FirstName, 
      LastName = user.LastName, 
      Address = user.Address, 
      City = user.City, 
      State = user.State, 
      Zip = user.Zip, 
      Email = user.Email, 
      PhoneMobile = user.PhoneMobile, 
      PhoneBus = user.PhoneBus, 
      PhoneExt = user.PhoneExt, 
      PhoneFax = user.PhoneFax, 
      RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem() 
      { 
       Selected = userRoles.Contains(x.Name), 
       Text = x.Name, 
       Value = x.Name 
      }) 
     }); 
    } 

    // 
    // POST: /Users/Edit/5 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Include = "Dealer,UserName,FirstName,LastName,Address,City,State,Zip,Email,PhoneMobile,PhoneFax,PhoneBus,PhoneExt,Id")] 
    AdminEditUserViewModel editUser, params string[] selectedRole) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindByIdAsync(editUser.Id); 
      if (user == null) 
      { 
       return HttpNotFound(); 
      } 

      user.Dealer = editUser.Dealer; 
      user.UserName = editUser.UserName; 
      user.FirstName = editUser.FirstName; 
      user.LastName = editUser.LastName; 
      user.Address = editUser.Address; 
      user.City = editUser.City; 
      user.State = editUser.State; 
      user.Zip = editUser.Zip; 
      user.Email = editUser.Email; 
      user.PhoneMobile = editUser.PhoneMobile; 
      user.PhoneBus = editUser.PhoneBus; 
      user.PhoneExt = editUser.PhoneExt; 
      user.PhoneFax = editUser.PhoneFax; 

      var userRoles = await UserManager.GetRolesAsync(user.Id); 

      selectedRole = selectedRole ?? new string[] { }; 

      var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray<string>()); 

      if (!result.Succeeded) 
      { 
       ModelState.AddModelError("", result.Errors.First()); 
       return View(); 
      } 
      result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray<string>()); 

      if (!result.Succeeded) 
      { 
       ModelState.AddModelError("", result.Errors.First()); 
       return View(); 
      } 
      return RedirectToAction("Index"); 
     } 
     ModelState.AddModelError("", "Something failed."); 
     return View(); 
    } 

Versus den Code für die Auflistung der Telefone in der Steuerung:

public async Task<ActionResult> ListPhones(string id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var user = await UserManager.FindByIdAsync(id); 
     if (user == null) 
     { 
      return HttpNotFound(); 
     } 

     return View(new AdminEditUserViewModel() 
     { 
      Id = user.Id, 
      PhoneMobile = user.PhoneMobile, 
      PhoneBus = user.PhoneBus, 
      PhoneExt = user.PhoneExt, 
      PhoneFax = user.PhoneFax 
     }); 
    } 

Antwort

0

eine benutzerdefinierte Aktion erstellen und versuchen, etwas wie:

<a href="/GetPhoneInfo/@item.Id" data-toggle="popover" title="Phones">@Html.DisplayFor(modelItem => item.UserName)</a> 
+0

Vielen Dank für Ihre Eingabe. Das Problem ist jedoch, dass ich glaube, dass die href # sein sollte, so dass das Popover angeklickt werden kann, ohne auf die neue Seite umzuleiten. Die Art der Einrichtung besteht darin, dass Sie den Mauszeiger über einen Benutzer halten können, um alle mit dem Benutzer verknüpften Telefone anzuzeigen. Klicken Sie dann jedoch auf den Benutzer, um ihn beizubehalten, und klicken Sie auf eine der Nummern. Ich habe versucht, mit Ihrem Vorschlag herumzuspielen, aber von dem, was ich verstehe, wird das immer auf diese Seite umleiten, anstatt das Popover zu öffnen. – MAXXtreme

0

Wie üblich sollten Sie die docs lesen. Ich nehme an, Sie verwenden Bootstrap, weil es aussieht wie Bootstrap und Bootstrap wird von MVC standardmäßig verwendet. Als Nachschlagewerk sollten Sie sich jedoch zu solchen Dingen äußern, und Sie sollten Ihre Frage wahrscheinlich auch so markieren.

Das gesagt, die Docs sagen Ihnen alles, was Sie wissen müssen. Sie müssen die Trigger angeben, die das Popover aktivieren, und zum Glück erlaubt Ihnen das Bootstrap-Popover mehrere Trigger. In Ihrem Szenario sollten Sie sowohl als auch focus verwenden. Der Auslöser focus öffnet das Popover beim Klicken und hält es dann offen, bis es den Fokus verliert, was genau so aussieht, wie Sie es möchten.

Grundsätzlich müssen Sie nur ihre bereitgestellten Code für einen „dismissable“ popover nehmen und fügen Sie die zusätzlichen hover Trigger:

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover" data-trigger="focus hover" title="Dismissible popover" data-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</a> 

Dann natürlich, fertigen Sie einfach die Inhalte/Klassen auf Ihre Bedürfnisse.

0

demo

konnte ich es work.send mir Ihre E-Mail für das Beispielprojekt machen.

+0

Super, danke! Meine E-Mail-Adresse lautet [email protected] – MAXXtreme