【问题标题】:I need to run Action Method in Partial View but it redirect me to another action我需要在部分视图中运行操作方法,但它会将我重定向到另一个操作
【发布时间】:2019-05-21 11:08:19
【问题描述】:

我需要从动作方法运行部分视图作为子动作方法,但它会将我重定向到另一个视图。

1- 我尝试使用Html.Action("myAction","myController")[ChildActionOnly] 数据注释,但没有任何好处

2- 我尝试使用Html.RenderAction("myAction", "My Controller"),并将操作方法​​更改为PartialViewResultreturn PartialView("View", myData),但没有任何好处。

3- 我尝试使用 JQuery AJAX,但也没有任何好处。

What I get

What I Expect

** 这是控制器

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


** 这是部分查看代码

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


** 路线图片 Route Config Picture
我希望在 RemoveRoleFromUser 的同一视图中部分运行 Action Method (_GetUserRoles)。

【问题讨论】:

  • 请分享jQuery ajax 代码。使用 jQuery ajax 应该可以工作。
  • @akg179 我在上面添加了 JQuery AJAX 代码。

标签: c# razor ef-code-first asp.net-mvc-partialview asp.net-mvc-5.2


【解决方案1】:

您的回报必须是 PartialView() 而不是视图。 view() 将返回一个完整的视图,而 PartialView() 将返回一个局部视图。所以你需要改变你的

return View();

return PartialView("YourPartialViewName"); 

如果您需要将参数传递给局部视图

return PartialView("YourPartialViewName",roles);

如果你从你的视图中渲染部分视图,你可以使用 Html hepler

return PartialView("~/views/ABC/PartialViewName.cshtml", Yourmodel);

【讨论】:

【解决方案2】:

我假设您的 ajax 调用触发了控制器操作。而部分视图需要放在父视图代码处-

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

基于这些假设,您需要更改代码中的一些内容:

  1. 从操作中返回 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.
  1. id 属性添加到您在其中写入@Html.Partial("_GetUserRoles") 的div。像这样:
<div class="row container">
    <div class="col-md-12" id="userRoles">
    </div>
</div>
  1. 在ajax方法的success函数中,你需要使用上面步骤中设置的id属性并在其中填充data。像这样:
success: function (data)  
{  
    $('#userRoles').html(data);
}
  1. 在您的项目中安装Microsoft.Jquery.Unobtrusive.AjaxMicrosoft.Jquery.Unobtrusive.Validation。然后在您的视图文件中添加这两个的引用。像这样:
@section scripts{  
    @Scripts.Render("~/Scripts/jquery{version}.js") 
    @Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")   
}

通过这种方式,您应该能够在现有视图本身中看到局部视图。

【讨论】:

  • 嗨@akg179,谢谢你的回答,我按照你说的做了,但我遇到了同样的问题。
  • 你的 ajax 方法被调用了吗?你得到的响应格式是否正确?
  • 是的,我的 AJAX 函数被调用,它给了我数据然后重定向到新视图,我不知道为什么?
  • 你用的是什么版本的jquery?
  • JQuery 版本 3.3.1
【解决方案3】:

这就是答案

我使用 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[""] 放置视图。


问候,
阿里·摩萨德
软件开发人员

【讨论】:

    【解决方案4】:

    我建议改变

    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>
    

    【讨论】:

    • 嗨@Andre Sanson,谢谢你的回答,我试试你告诉我的,但它没有用,如果你可以将AJAX方式应用于我的代码并编写它,这将是更多让我更好地理解您告诉我的内容,再次感谢您。
    • @ali 我编辑了我的 answear 以展示如何使用 ajax + 部分视图来做到这一点。
    • 嗨@andre Sanson,我使用了您新编辑的答案,但它不起作用,我通过 ViewData[''] 解决了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多