Мне нужно запустить метод действия в частичном представлении, но он перенаправляет меня на другое действие - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно запустить Partial View из метода действия как дочерний метод действия, но он перенаправляет меня в другое представление.

1 - я пытался использовать Html.Action ("myAction", "myController") иЯ использую аннотацию данных [ChildActionOnly], но без каких-либо льгот

2 - я пытался использовать Html.RenderAction («myAction», «My Controller») и меняю метод действия как PartialViewResult и возвращаю PartialView («View»).", myData), но без каких-либо льгот.

3 - Я пытался использовать JQuery AJAX, но без какой-либо выгоды.

Что я получаю

Что я ожидаю

** Это контроллер

[Authorize(Roles = "Admin")]
[HttpPost]
[ChildActionOnly]
public ActionResult _GetUserRoles(string UserName)
  {
            SqlParameter param1 = new SqlParameter("@UserName", UserName);
            try
            {
                IList<GetUserRolesViewModel> roles = Identitydb.Database.SqlQuery<GetUserRolesViewModel>("admin.sp_GetUserRoles @UserName",
                ((ICloneable)param1).Clone()).ToArray().ToList();
                return View(roles);
            }
            catch (Exception ex)
            {
                ViewBag.Error = ex.ToString();
                return RedirectToAction("ErrorSaveData");
            }
   }


** Это код PartialView

@model IEnumerable<AMSIdentity.Controllers.GetUserRolesViewModel>


@if (Model == null)
{
    <table></table>
}
else
{
    <table class="table table-responsive table-striped table-hover table-bordered table-condensed container" style="margin-top: 5%;">
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Name)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Id)
                </th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Id)
                    </td>
                </tr>
            }
        </tbody>
    </table>

    <br />

    @Html.ActionLink("Return Back", "RemoveRoleFromUser", "Manage")
}


** Это код родительской страницы


    ViewBag.Title = "RemoveRoleFromUser";
    var error = ViewBag.Error as IEnumerable<String>;
}

<h2> Remove role from user </h2>
<ul></ul>
<div class="row container">
    <div class="col-md-6">

        @using (Html.BeginForm())
        {
            @Html.AntiForgeryToken()

            <div class="form-horizontal">
                <hr />
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })

                <div class="form-group">
                    @Html.Label("Username", htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.Editor("UserName", new { htmlAttributes = new { @class = "form-control" } })
                    </div>
                    <hr />
                    @Html.Label("Role Id", htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.Editor("RoleId", new { htmlAttributes = new { @class = "form-control" } })
                    </div>

                </div>

                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Remove" class="btn btn-default btn-danger" />
                    </div>
                </div>
            </div>
        }

    </div>

    <div class="col-md-6">

        <div class="row container">
            <div class="col-md-12">
                <h3> Get user roles </h3>
                @using (Html.BeginForm("_GetUserRoles", "Manage", FormMethod.Post))
                {
                    @Html.AntiForgeryToken()
                    <div class="form-horizontal">
                        <hr />
                        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

                        <div class="form-group">
                            @Html.Label("Username", htmlAttributes: new { @class = "control-label col-md-2" })
                            <div class="col-md-10">
                                @Html.Editor("UserName", new { htmlAttributes = new { @class = "form-control" } })
                            </div>

                        </div>

                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <input type="submit" value="Get rules" class="btn btn-default btn-success" id="btnRules"/>
                            </div>
                        </div>
                    </div>
                }
            </div>
        </div>

        <div class="row container">
            <div class="col-md-12">
               @Html.Partial("_GetUserRoles")
            </div>
        </div>


    </div><!--Second Column-->

</div> <!--End of row-->


@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}


** Это представление Модель

public class GetUserRolesViewModel
    {
        [DisplayName("Username")]
        public string Name { get; set; }
        [Key]
        [DisplayName("Role Id")]
        public string Id { get; set; }
    }


** Это код AJAX, который я использовал для запускачастичное представление

<script type="text/javascript">
    //$(document).ready(function ()
    //{
        $("#btnRules").click(function (e)
        {
            var UserName = $("#UserName").val();

            $.ajax({
                url: '/Manage/_GetUserRoles',
                dataType: 'html',
                data:{"UserName": UserName},
                success: function (data)
                {
                    $('#listRules').html(data);
                },
                error: function (xhr, ajaxOptions, thrownError)
                {
                     alert('Failed to retrieve rules.');
                }
            });
        });
    //});

</script>


** Изображение маршрута Изображение конфигурации маршрута
Я ожидаю запуска метода действия (_GetUserRoles) Pфактически в том же представлении RemoveRoleFromUser.

Ответы [ 4 ]

0 голосов
/ 22 мая 2019

Вот ответ

Я использую ViewData [""] вместо PartialView и помещаю один параметр в один и тот же результат действия, чтобы проверить, какое представление я буду использовать.

** Метод действия RemoveRoleFromUserConfirmed

public ActionResult RemoveRoleFromUserConfirmed(string UserName, string RoleId, string btnval)
        {

            if (btnval == "Remove")
            {
                if (UserName == null && RoleId == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                SqlParameter param1 = new SqlParameter("@RoleId", RoleId);
                SqlParameter param2 = new SqlParameter("@UserName", UserName);
                try
                {
                    Identitydb.Database.ExecuteSqlCommand("admin.sp_RemoveUserFromRole @RoleId, @UserName", param1, param2);
                }
                catch (Exception ex)
                {
                    ViewBag.Error = ex.ToString();
                    return RedirectToAction("ErrorSaveData");
                }

                return RedirectToAction("Roles");
            }

            else if (btnval == "Get Rules")
            {


                SqlParameter param1 = new SqlParameter("@UserName", UserName);
                try
                {
                    IList<GetUserRolesViewModel> roles = Identitydb.Database.SqlQuery<GetUserRolesViewModel>("admin.sp_GetUserRoles @UserName",
                    ((ICloneable)param1).Clone()).ToArray().ToList();

                    string result = "";

                    foreach (var item in roles)
                    {
                        result += "<tr>"
                                 + "<td>" + item.Name + "</td>"
                                 + "<td>" + item.Id + "</td>"
                                + "</tr>";
                    }

                    ViewData["getrules"] = result;
                    return View();
                }
                catch (Exception ex)
                {
                    ViewBag.Error = ex.ToString();
                    return RedirectToAction("ErrorSaveData");
                }

            }
            return View();
        }


** Это вид

@{
    ViewBag.Title = "RemoveRoleFromUser";
    var error = ViewBag.Error as IEnumerable<String>;
}

<h2> Remove role from user </h2>
<ul></ul>
<div class="row container">
    <div class="col-md-6">

        @using (Html.BeginForm("RemoveRoleFromUser", "Manage", FormMethod.Post))
        {
            @Html.AntiForgeryToken()

            <div class="form-horizontal">
                <hr />
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })

                <div class="form-group">
                    @Html.Label("Username", htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.Editor("UserName", new { htmlAttributes = new { @class = "form-control" } })
                    </div>
                    <hr />
                    @Html.Label("Role Id", htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                        @Html.Editor("RoleId", new { htmlAttributes = new { @class = "form-control" } })
                    </div>

                </div>

                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Remove" name="btnval" class="btn btn-default btn-danger" />
                    </div>
                </div>
            </div>
        }

    </div>

    <div class="col-md-6">


        <div class="row container">
            <div class="col-md-12">
                <h3> Get user roles </h3>
                @using (Html.BeginForm("RemoveRoleFromUser", "Manage", FormMethod.Post))
                {
                    @Html.AntiForgeryToken()
                    <div class="form-horizontal">
                        <hr />
                        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

                        <div class="form-group">
                            @Html.Label("Username", htmlAttributes: new { @class = "control-label col-md-2" })
                            <div class="col-md-10">
                                @Html.Editor("UserName", new { htmlAttributes = new { @class = "form-control" } })
                            </div>

                        </div>

                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <input type="submit" value="Get Rules" name="btnval" class="btn btn-default btn-success" id="btnRules" />
                            </div>
                        </div>
                    </div>
                }
            </div>
        </div>

        <div class="row container">
            <div class="col-md-12" id="listRules">
               <!--Data Come from ViewData-->
                <table class="table table-responsive table-striped table-hover table-bordered table-condensed container" style="margin-top: 5%;">
                    <thead>
                        <tr>
                            <th>
                                Role Name
                            </th>
                            <th>
                                Role Id
                            </th>
                        </tr>
                    </thead>
                    <tbody>
                        @Html.Raw(ViewData["getrules"])
                    </tbody>
                </table>
            </div>
        </div>


    </div><!--Second Column-->

</div> <!--End of row-->



<div>
    @Html.ActionLink("Back to List", "Roles")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}


Я поместил название кнопки в две кнопки (удалить и получить правила) после этого я проверил значение кнопки в ActionMethod и если это удалить это будет делать некоторые функции, и если это получить правила, я буду использовать ViewData [""], чтобы поместить представление.


С уважением,
Али Мосаад
Разработчик программного обеспечения

0 голосов
/ 21 мая 2019

ваше возвращение должно быть PartialView (), а не представлением. view () вернет полный вид, а PartialView () вернет частичный вид. Так что вам нужно изменить свой

return View();

до

return PartialView("YourPartialViewName"); 

и если вам нужно передать параметр в частичное представление

return PartialView("YourPartialViewName",roles);

если вы визуализируете частичное представление из своего View, вы можете использовать Html hepler

return PartialView("~/views/ABC/PartialViewName.cshtml", Yourmodel);
0 голосов
/ 22 мая 2019

Я предполагаю, что ваш вызов ajax попадает в действие контроллера.А частичное представление должно быть помещено в код родительского представления по адресу -

<div class="row container">
    <div class="col-md-12">
        @Html.Partial("_GetUserRoles")
    </div>
</div>

. Исходя из этих предположений, вам необходимо изменить несколько вещей в своем коде:

  1. return PartialView вместо View от действия.Примерно так:
return PartialView("_GetUserRoles", roles);

// the partial view name mentioned here is just a sample based on the context. 
//You need to give your partial view's name here.
добавить атрибут id к элементу div, внутри которого вы написали @Html.Partial("_GetUserRoles").Примерно так:
<div class="row container">
    <div class="col-md-12" id="userRoles">
    </div>
</div>
внутри функции success в методе ajax, вам нужно использовать атрибут id, заданный в предыдущем шаге, и заполнить data внутри него.Примерно так:
success: function (data)  
{  
    $('#userRoles').html(data);
}
Установите Microsoft.Jquery.Unobtrusive.Ajax и Microsoft.Jquery.Unobtrusive.Validation в вашем проекте.Затем добавьте ссылку на эти два в ваш файл представления.Примерно так:
@section scripts{  
    @Scripts.Render("~/Scripts/jquery{version}.js") 
    @Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")   
}

Таким образом, вы сможете увидеть частичное представление в самом существующем представлении.

0 голосов
/ 21 мая 2019

Я бы предложил изменить

return View(roles);

до

return PartialView(roles); 

или

return PartialView("_GetUserRoles", roles);

Использование ajax

$.ajax({
    url: '/Manage/_GetUserRoles',
    dataType: 'html',
    data:{"UserName": UserName},
    success: function (data)
    {
        $('#listRules').html(data);
    },
    error: function (xhr, ajaxOptions, thrownError)
    {
         alert('Failed to retrieve rules.');
    }
});
...
<div class="row container">
   <div id="listRules" class="col-md-12">
      @Html.Partial("_GetUserRoles", Model.Roles)
   </div>
</div>
...