为什么Ajax在第一次请求时正常工作,但在第二次请求时返回新页面上的部分视图?
我有一个嵌套在表中每一行的Ajax表单,以提供添加/删除function。 部分列出了所有可用角色(Microsoft身份2.0),并为每个角色列出了指定用户是否与该角色相关联,以及用于切换用户进出角色(Ajax)的按钮。
当我使用Ajax.Beginform时,一切正常,但是当我使用常规jquery时,它第一次单击按钮切换用户与角色的关联时工作,但第二次将部分视图加载到其新页面上拥有没有CSS风格。
在stackoverflow上搜索,我看到其他人有类似的问题,但他们似乎根本没有ajax工作,不像我有第一个请求工作,然后没有。 我还应该提一下,我是Asp.net的新手,这是我第一次直接使用jquery(遵循Scott Allan关于PluralSight的教程)。
这是我已经尝试过的:检查该操作是否被带有调试断点的ajax请求命中。 检查我在布局视图中引用了jquery,并且不超过一次。 检查我是否以正确的顺序引用jquery和jquery unobtrusive ajax。 检查web.config是否将相关标志设置为true。
我已经被困在这几个小时了,任何指导都会非常感激。
BundleConfig.cs:
namespace GCCP { public class BundleConfig { // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862 public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.validate*", "~/Scripts/jquery.unobtrusive*")); bundles.Add(new ScriptBundle("~/bundles/gccp").Include( "~/Scripts/gccp.js")); // Use the development version of Modernizr to develop with and learn from. Then, when you're // ready for production, use the build tool at http://modernizr.com to pick only the tests you need. bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*")); bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include( "~/Scripts/bootstrap.js", "~/Scripts/respond.js")); bundles.Add(new StyleBundle("~/Content/css").Include( "~/Content/bootstrap.css", "~/Content/site.css")); // Set EnableOptimizations to false for debugging. For more information, // visit http://go.microsoft.com/fwlink/?LinkId=301862 BundleTable.EnableOptimizations = true; } } }
行动方法:
public ActionResult UserRoles(string returnUrl, string UserName) { ViewBag.ReturnUrl = returnUrl; UserRolesViewModel Model = new UserRolesViewModel(); Model.UserName = UserName; Model.RoleAssignments = UserRoleAssignments(UserName); return View(Model); } [HttpPost] public ActionResult ToggleUserToRoleAssignment(string returnUrl, string UserName, string RoleName) { ViewBag.ReturnUrl = returnUrl; var userStore = new UserStore(context); var userManager = new UserManager(userStore); var roleStore = new RoleStore(context); var roleManager = new RoleManager(roleStore); string userID = userManager.FindByName(UserName).Id; if ( roleManager.RoleExists(RoleName) == true ) { if ( userManager.IsInRole(userID, RoleName) == true ) { userManager.RemoveFromRole(userID, RoleName); } else { userManager.AddToRole(userID, RoleName); } }
视图模型:
namespace GCCP.Models { public class UserRolesViewModel { [Required] [Display(Name = "User")] public string UserName { get; set; } public Dictionary RoleAssignments { get; set; } public string AjaxTest { get; set; } } }
视图:
@using GCCP.Models; @using System.Web.Mvc.Ajax; @model UserRolesViewModel @{ ViewBag.Title = "User Roles"; } @Model.UserName | Assigned Roles
@Html.Partial("_UserRolesList", Model)
部分视图:
@using GCCP.Models; @using System.Web.Mvc.Ajax; @model UserRolesViewModel Roles Assigned Add / Remove @foreach ( var item in Model.RoleAssignments ) { if ( item.Value ) { @item.Key } else { @item.Key } }
jQuery的:
$(function () { var ajaxFormSubmit = function () { var $form = $(this); var options = { url: $form.attr("action"), type: $form.attr("method"), data: $form.serialize() }; $.ajax(options).done(function (data) { var $target = $($form.attr("data-gccp-target")); $target.replaceWith(data); }); return false; }; $("form[data-gccp-ajax='true']").submit(ajaxFormSubmit); });
提前致谢 :)
“仅第一次工作”行为是典型的动态添加内容的情况,但事件直接绑定到元素(例如,在DOM就绪)。
相关部分是这样的:
$("form[data-gccp-ajax='true']").submit(ajaxFormSubmit);
这只绑定到运行该代码行时存在的现有表单。
另一种方法是使用委托的事件处理程序,附加到元素的不变的祖先:
例如
$('#roleAssignmentList').on("submit", "form[data-gccp-ajax='true']", ajaxFormSubmit);
它的工作原理是通过侦听提交事件来冒泡到该祖先, 然后将jquery选择器应用于bubble-chain中的元素, 然后应用frunction。
如果您没有方便的不变的祖先使用document
。 我并非100%确定您没有完全替换#roleAssignmentList
(或仅仅是其子代),因此该示例无法使用document
。
例如
$(document).on("submit", "form[data-gccp-ajax='true']", ajaxFormSubmit);
但从不使用’body’作为委托事件处理程序目标(它有一些与样式相关的错误,这意味着它可能会错过某些事件)。