TheBigBearNow Ответов: 2

Ищете лучший способ удалить роль с помощью кнопки ASP.NET MVC


Всем привет,
В настоящее время у меня есть эта работа, у меня есть кнопка отправки, которая в настоящее время используется для назначения ролей. У меня есть вторая кнопка для удаления ролей. Чтобы удалить роли, я вызываю вызов $.ajax и передаю свой контроллер с идентификатором своему действию. Это работает, но мои TempData[msg] не сохраняются, поэтому, когда вызов заканчивается, сообщение не отображается, как при добавлении роли. Кроме того, роли не обновляются с помощью моего " return redirectToAction()’ в конце моего метода действия.
Вот что у меня есть, есть ли способ заставить эти маленькие вещи работать или есть еще какие-то идеи, чтобы сделать это?
Спасибо,
//VIEW This is where I am getting my userId from this DropDownList @Html.AntiForgeryToken()

            <div class="row">
                <div class="col-md-4">
                    @Html.DropDownListFor(a => a.UserId,
                     new SelectList(Model.lstAdmins, "UserId", "Name"),
                     new { @class = "form-control", @id = "userAdmins" })
                    @* , @onChange = "SelectedValue(this)"*@
                    @Html.HiddenFor(a => a.UserId)
                    @Html.ValidationMessageFor(a => a.UserId)
                </div>
                <div class="col-md-4"></div>
                <div class="col-md-4"></div>
            </div><div class="row">
                @for(var i = 0; i < Model.lstUsers.Count(); i++)
                {
                    <div class="col-md-4">
                        <div>
                            @Html.CheckBoxFor(u => Model.lstUsers[i].SelectedUsers)
                            <label>
                                @Html.DisplayFor(u => Model.lstUsers[i].Name)
                                @Html.HiddenFor(u => Model.lstUsers[i].UserId)
                                @Html.HiddenFor(u => Model.lstUsers[i].Name)
                            </label>
                        </div>
                    </div>
                }
            </div>
            <br />
            <div class="row">
                <div class="form-group">
                    <div class="col-md-offset-0 col-md-12">
                        <input type="submit" value="Assign Role" class="btn btn-success" />
                        @* @Url.Action("RemoveAdmin", "SuperAdmin") *@

                        <button type="button" onclick="clickMe()"
                                class="btn btn-danger">
                            Remove Role
                        </button>

                        @Html.ActionLink("Cancel", "Dashboard", "SuperAdmin",
                         null, new { @class = "btn btn-danger" })
                    </div>                                                          <script type="text/javascript">
    //$(function () {

    function clickMe() {
        var userid = $("#userAdmins").val();
        if (userid != "") {
            $.ajax({
                url: "RemoveAdmin/SuperAdmin",
                data: { userid: userid },
                type: "POST",
                //success: function () {
                //    alert("Success");
                //},
                //error: function () {
                //    alert("Error");
                //}
            });
        }
        //window.location.href =
            //'Url.Action("RemoveAdmin", "SuperAdmin")/' + userid;
        //alert("val" + selectedValue);
    }
// CONTROLLER ACTION
[HttpPost]
        //[ValidateAntiForgeryToken]
        public ActionResult RemoveAdmin(string userid)
        {
            ApplicationUser au = context.Users.Where(u => u.Id.Equals(userid,
                StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);
            manager.RemoveFromRole(au.Id, "Admin");
            manager.AddToRole(au.Id, "User");

            TempData["Success"] = "Roles Assigned Successfully";
            return RedirectToAction("AssignAdmin");
        }


Что я уже пробовал:

Я использовал свой контроллер для создания действия для добавления пользователей в роль, которая работает без каких-либо issses, и у меня есть 2 метода, которые получают всех текущих пользователей с определенными ролями. Я хочу, чтобы это называлось my uses, чтобы он мог отображать правильный эфир пользователей в раскрывающемся списке, если они являются администраторами, или в lstUsers, если они являются обычными пользователями. Я использовал javascript, чтобы получить значение и aajax, чтобы сделать вызов, но он не работает на 100% так, как я хочу

2 Ответов

Рейтинг:
0

#realJSOP

Вместо того чтобы иметь две кнопки, используйте флажок, чтобы указать, имеет ли пользователь эту роль или нет, и одну кнопку отправки.


Рейтинг:
0

Richard Deeming

Вы делаете запрос AJAX и ничего не делаете с ответом.

Измените свое действие, чтобы вернуть только URL-адрес перенаправления, если запрос является AJAX-запросом:

[HttpPost]
public ActionResult RemoveAdmin(string userid)
{
    ...
    
    TempData["Success"] = "Roles Assigned Successfully";
    if (Request.IsAjaxRequest()) return Json(Url.Action("AssignAdmin"));
    return RedirectToAction("AssignAdmin");
}

Затем измените код Javascript таким образом, чтобы он переходил к возвращаемому URL-адресу при успешном выполнении запроса AJAX:
$.ajax({
    url: "RemoveAdmin/SuperAdmin",
    data: { userid: userid },
    type: "POST",
    success: function(result) {
        window.location.assign(result);
    }
});


TheBigBearNow

Это почти решило мою проблему, я чувствую, но это все еще не сработало.. Мой проект не обновляется при нажатии кнопки + tempdata msg не отображается. Вот мой код.

[HttpPost]
        //[ValidateAntiForgeryToken]
        public ActionResult RemoveAdmin(string userid)
        {
            ApplicationUser au = context.Users.Where(u => u.Id.Equals(userid,
                StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);
            
            manager.RemoveFromRole(au.Id, "Admin");
            manager.AddToRole(au.Id, "User");
            if (Request.IsAjaxRequest())
            {
                TempData["SuccessRole"] = "Role Removed Successfully";
                Json(Url.Action("AssignAdmin"));
                return RedirectToAction("AssignAdmin", "SuperAdmin");
            }
            
            //TempData["Success"] = "Roles Assigned Successfully";
            return RedirectToAction("AssignAdmin");
        }
 function clickMe() {
        var userid = $("#userAdmins").val();
        if (userid != "") {
            $.ajax({
                url: "RemoveAdmin/SuperAdmin",
                data: {
                    userid: userid
                },
                type: "POST",
                success: function (result) {
                    window.location.assign(result);
                }
                //error: function () {
                //    alert("Error");
                //}
            });

Richard Deeming

Ты забыл это сделать return ответ JSON на запрос AJAX:

[HttpPost]
public ActionResult RemoveAdmin(string userid)
{
    ApplicationUser au = context.Users.Where(u => u.Id.Equals(userid, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
    var store = new UserStore<ApplicationUser>(context);
    var manager = new UserManager<ApplicationUser>(store);
    
    manager.RemoveFromRole(au.Id, "Admin");
    manager.AddToRole(au.Id, "User");
    
    TempData["SuccessRole"] = "Role Removed Successfully";
    if (Request.IsAjaxRequest()) return Json(Url.Action("AssignAdmin", "SuperAdmin"));
    return RedirectToAction("AssignAdmin", "SuperAdmin");
}