【问题标题】:How to make Html.Action parameters dynamic?如何使 Html.Action 参数动态化?
【发布时间】:2021-07-08 20:30:33
【问题描述】:

我正在使用 ASP.NET MVC。我有一个动作,我调用它来获取部分视图。我使用@Html.Action() 来获取部分视图。它工作正常,但仅适用于id=533。假设当用户单击网格按钮时,我们可以调用 Javascript 函数。从该函数中,我如何将 id 和 tab 值传递给 Html.Action() 并检索部分视图 html/js。仅供参考 - 部分视图的 Javascript 也必须工作。

<div ng-controller="submissionDashboardController">
    @Html.Action("SubmissionHeader", "Submission", new { id = 533, tab = 0 })
</div>

@using (Html.RequiredScripts())
{
    @Html.RequirePageScript("Shared", "ShortcutLinks")
    @Html.RequirePageScript("Submission", "ListSubmissionDashboard")
    @Html.RequirePageScript("Shared", "GridPersonalization")
    @Html.RequirePageScript("Shared", "SubmissionCreation")
}

这是提交控制器中的 SubmissionHeader 操作。

[ChildActionOnly]
        public ActionResult SubmissionHeader(int? id, SubmissionTabEnum tab = SubmissionTabEnum.None)
        {
            // More logic and code here...

            TempData["SubmissionHeaderID"] = id;
            return PartialView("_SubmissionHeader", model);
        }

附加注释/代码:这是 JavaScript Ajax 调用,用于将 div 替换为最新的 html 响应。与局部视图关联的这种方法的问题 java 脚本不起作用,任何从 html 响应触发的事件都不起作用。

被 html ajax 调用响应替换的 Div。

<div id="comment"></div>

这是调用ajax传递动态参数的javascript函数-

<script>

function DisplayCommentDialog(SubmissionID) {
        
        // Ajax Call for Dynamic Parameters and html partial view response
        $.ajax({
            type: 'POST',
            dataType: 'html',
            url: '/Submission/SubmissionHeader',
            async: false,
            data: { id: SubmissionID, tab: 0 },
            success: function (result) {
                commentDiv = result;
                $("#comment").html(commentDiv);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
            }
        });
    }
</script>

【问题讨论】:

  • 这个问题太笼统了。 “所以它适用于所有 id”是什么意思。你打算如何传递这些 id?
  • 在示例中 id = 533。它也应该适用于其他 id,例如 516、578 等。所有这些值都假定动态传递而不是硬编码在代码中。
  • 您可以将模型或视图包中的参数从控制器传递到视图。
  • 我有模型中的 id,但是当用户单击按钮时,如何在 @Html.Action() 中动态传递 id?
  • 这必须在例如javascript中完成。

标签: javascript angularjs asp.net-mvc asp.net-ajax html.actionlink


【解决方案1】:

我假设您正在尝试替换控制器中的 id,然后将其传递给局部视图。如果是这样,你可以做这样的事情。替换

@Html.Action("SubmissionHeader", "Submission", new { id = 533, tab = 0 })

例如:

<button class="btn btn-secondary" type="button" onclick="DisplayCommentDialog()">Press here</button>

在您的局部视图中,使用从控制器传递的值创建隐藏字段 [Id]

@Html.Hidden("Id", @id)

最后在你的脚本中

<script>

var id = 533; // replace with initial values from model if nesesery
var tab = 0;

function DisplayCommentDialog() {
        
        // Ajax Call for Dynamic Parameters and html partial view response
        $.ajax({
            type: 'POST',
            dataType: 'html',
            url: '/Submission/SubmissionHeader',
            async: false,
            data: { id: id, tab: tab },
            success: function (result) {
                commentDiv = result;
                $("#comment").html(commentDiv);
                id = $($.parseHTML(result)).filter('#Id').val(); // set new id value from result
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
            }
        });
    }
</script>

编辑

如果您将按钮动态加载到 DOM,则必须将事件附加到文档而不是特定元素。

$(document).on('click','#your_button_id', function(){
   // desired function here
})

【讨论】:

  • 谢谢。正如我之前提到的以下代码 $("#comment").html(commentDiv);确实用部分视图html替换了div,但javascipt不起作用。例如,假设 - 评论 div 有一个按钮,当用户单击该按钮时,它不会触发。由于某些原因,无法访问与局部视图相关的 Javascript。我该如何解决这个问题?
  • 这是因为您将元素动态加载到 dom 并且事件已分离。查看我的更新。
  • 完全同意,如果我们按照您建议的方式将事件附加到文档,它能够从部分视图触发按钮。我现在才测试。感谢您提出这种方法。但是部分视图有一个javascript,例如partial.js——这个文件正在做其他一些事情,比如加载数据填充/绑定等。由于这个.js文件没有正确加载——我们作为ajax响应的一部分获得的部分视图html不能正常工作。有趣的是,@html.Action() 能够以某种方式加载该 .js 文件。不知道如何使用 ajax 调用来实现。有什么想法吗?
  • 控制台说什么?您正在将 javascript 加载到 div 的部分视图中,所以我敢打赌您在控制台中有错误。您必须在此 div 之前加载 jquery 才能使其工作。尝试将其添加到头部。另一种可能性是在主视图中包含这个 js。
  • 控制台没有错误。但是我注意到我正在尝试加载的 JS 文件被加载了 @Html.Action("SubmissionHeader", "Submission", new { id = 533, tab = 0 }) 但如果我嵌入该 JS 它不会被加载在头中或使用 Html.RequirePageScript() 包含文件。 JS 文件有 AngularJS 控制器 mainApp.controller('submissionHeaderActionsController', ['$scope', '$http', function ($scope, $http, viewDataService) {$scope.showCommentModal = function (e) {alert('showCommentModal' );};}]);不确定这是否与 AngularJS 控制器有关,知道可能是什么问题吗?
【解决方案2】:

最后我可以通过修改我的方法来解决这个问题。

这是我关注的 -

  1. 我像以前一样保持评论 div。

  2. 我更新了这个 Div,像在页面加载时一样进行 ajax 调用并动态传递参数 -

    function DisplayCommentDialog(id, tab) {
            
            // Ajax Call for Dynamic Parameters and html partial view response
            $.ajax({
                type: 'POST',
                dataType: 'html',
                url: '/Submission/SubmissionHeader',
                async: false,
                data: { id: id, tab: tab },
                success: function (result) {
                    commentDiv = result;
                    $("#comment").html(commentDiv);
                    id = $($.parseHTML(result)).filter('#Id').val(); // set new id value from result
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                }
            });
        }
    
  3. 这将解决动态变量的问题,并且当我替换了 DIV id 和选项卡值时,更新的内容将显示在 DIV 中。但请注意,这不会解决 onclick 或 onload 或任何 on 事件的任何问题。即使您使 js 文件可用,它们也会在 div 更新后死亡。为了解决这个问题,我必须重新绑定所有动态数据,在我的情况下,通过调用 ajax 来重新绑定下拉值并重新绑定下拉列表 - 类似这样。

    >     <script>
    >         function DisplayCommentDialog(EntityOrganizationID) {
    >             var categories = $("#commentrecipients").kendoDropDownList({
    >                 optionLabel: "Select Recipients...",
    >                 dataTextField: "Name",
    >                 dataValueField: "UserID",
    >                 height: 310,
    >                 Width: "900px",
    >                 dataSource: {
    >                     transport: {
    >                         read: function (options) {
    >                             $.ajax({
    >                                 url: "/Submission/SecurityGroupsUsersAccessRight",
    >                                 dataType: "JSON", // "jsonp" is required for cross-domain requests; use "json" for same-domain
    > requests
    >                                 data: {
    >                                     id: EntityOrganizationID
    >                                 },
    >                                 success: function (result) {
    >                                     // notify the data source that the request succeeded
    >                                     options.success(result);
    >                                 },
    >                                 error: function (result) {
    >                                     // notify the data source that the request failed
    >                                     options.error(result);
    >                                 }
    >                             });
    >                         }
    >                     }
    >                 }
    >             }).data("kendoDropDownList");
    >         }
    >     </script>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2017-01-14
    • 2013-05-16
    • 2015-07-06
    • 2011-03-10
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多