2016-05-16 48 views
0

Here is a picture how it lists all phone numbers from all users when I hover over the user account.通userid参数在Foreach循环与酥料饼的内容

我使用ASP.NET创建一个MVC项目,并使用剃刀由“@foreach(以型号VAR项目)”排队的所有用户。在该表中,我想要使用一个弹出窗口,该窗口将显示用户的电话号码,该电话号码一旦悬停在账户名称(称为经销商)上。它目前列出所有用户记录下来的所有电话,但我希望它只针对该用户。我尝试使用ActionLinks(我如何通过编辑,细节和删除相同的参数)以及标签,但似乎都不起作用。我如何传递UserID参数来限制弹出窗口只列出链接到特定用户的电话号码?

下面是表的代码:

<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> 

在控制器中,我创建了一个新的类,列出了手机信息,并试图传递参数那里。 这里是在传递正确的参数控制器编辑用户代码:

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(); 
    } 

对战的代码在控制器上市的手机:

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 
     }); 
    } 

回答

0

创建一个自定义操作,并尝试一些如:

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

感谢您的意见。但问题是我相信href应该是#,这样弹出窗口可以被点击而不需要重定向到新页面。需要设置的方式是,您可以将鼠标悬停在用户上以查看链接到该用户的所有电话,但是您然后单击该用户以使其保持不变,并因此单击其中一个号码。我试着玩弄你的建议,但根据我的理解,它总是会重定向到该页面,而不是打开弹出窗口。 – MAXXtreme

0

像往常一样,你应该阅读docs。我假设你正在使用Bootstrap,因为它看起来看起来就像Bootstrap,默认情况下MVC使用Bootstrap。不过,为了将来的参考,你应该明确这样的事情,你也应该以这种方式标记你的问题。

这就是说,文档告诉你你需要知道的一切。您必须指定将激活弹出窗口的触发器,幸运的是,Bootstrap的弹出窗口确实允许多个触发器。对于您的情况,您需要同时使用hoverfocusfocus触发器会在点击时打开弹出窗口,然后保持打开状态直至失去焦点,这看起来正是您想要的。

基本上,你只需要把自己提供的代码为“dismissable”酥料饼,并添加额外的hover触发:

<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> 

然后,当然,只是定制内容/班您的需求。

0

demo

我能使其work.send我您的电子邮件示例项目。

+0

太棒了,谢谢!我的电子邮件是[email protected]。 – MAXXtreme