He creado un formulario en mi aplicación .NET MVC 5 como el siguiente:
@using (Ajax.BeginForm("ChangePassword", "User", new { area = "UserSettings" }, new AjaxOptions { HttpMethod = "POST", OnSuccess = "alert('success');" //This will execute once the Ajax call is finished. }, null)) { @Html.TextBoxFor(m => m.Password, new { placeholder = "Password", @class = "form-control", @type = "password" })<br /> @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger", @style = "float:right;" }) @Html.TextBoxFor(m => m.PasswordConfirm, new { placeholder = "Confirm password", @class = "form-control", @type = "password" })<br /> @Html.ValidationMessageFor(model => model.PasswordConfirm, "", new { @class = "text-danger", @style = "float:right;" }) <button type="submit" class="btn btn-primary">Change Password</button> }Y este es el método en el controlador:
[HttpPost] [ActionName("ChangePassword")] public ActionResult ChangePassword(UserSettings model) { using (var ctx = new myContextEntities()) { var usr = ctx.Users.FirstOrDefault(x => x.Email == User.Identity.Name); model.FirstName = usr.FirstName; model.LastName = usr.LastName; model.Email = usr.Email; model.Country = usr.Countries.CountryName; if (ModelState.IsValid) { usr.PasswordSalt = Helpers.PasswordHelper.CreateSalt(40); usr.PasswordHash = Helpers.PasswordHelper.CreatePasswordHash(model.Password, usr.PasswordSalt); ctx.SaveChanges(); return View("UserSettings",model); } return View("UserSettings", model); } }Una vez que finaliza la llamada, la página simplemente se actualiza, lo que no debería suceder, pero debería mostrar el mensaje de éxito... ? ¿Qué estoy haciendo mal aquí?
Para la solicitud de Ajax, cree el siguiente paquete en BundleConfig.cs
public static void RegisterBundles(BundleCollection bundles) { //Create Your other bundles here //Create your Jquery validate bundle bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/Assets/jquery.validate.min.js", "~/Scripts/Assets/jquery.validate.unobtrusive.min.js", "~/Scripts/Assets/jquery.unobtrusive-ajax.min.js" )); }En su _Layout.cshtml. Incluir este paquete como:
@Scripts.Render("~/bundles/jqueryval")Asegúrese de incluir jQuery antes de este paquete. Tenga en cuenta que las rutas a los archivos javascript son ficticias en el bloque de código anterior. Debes dar tus propios caminos. Se deben incluir los siguientes archivos JS:
Espero eso ayude :)
Incluya Ajax discreto desde el siguiente enlace
Nota : no incluya jquery.unobtrusive-ajax.min.js y jquery.unobtrusive-ajax.min.js, incluya solo un archivo (js/min.js)
Los archivos a continuación no afectan nada para usted y su problema.
1.jquery.validate.min.js
2.jquery.validate.unobtrusive.min.js