【问题标题】:Refresh div content after OnGet method in Razor Pages在 Razor 页面中的 OnGet 方法之后刷新 div 内容
【发布时间】:2021-01-21 06:58:26
【问题描述】:

我在视图中有 1 个数据,这些数据在 OnGet 方法中分配为 ViewData。

OnGet 方法:

public void OnGet(string parameter = "default")
{
    ViewData["SelectedParam"] = parameter;
}

我的观点:

@{
    var selectedParam= ViewData["SelectedParam"];
}

<h1>Some Page</h1>
<hr />
<div class="row">
    <div class="col-3">
        <div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
            @await Component.InvokeAsync("MyComponent")
        </div>
    </div>
    <div class="col-9">
        <div id="mainDiv">
            @selectedParam
            <hr />
            @if (string.IsNullOrEmpty(selectedParam.ToString()))
            {
                <h5>No param selected</h5>
            }
            else
            {
                <h5>@selectedParam selected</h5>
            }
        </div>
    </div>
</div>

我的组件正在发送参数,View 正在更改 ViewData["SelectedParam"] 的值,现在我想刷新 div 的内容。

JQuery:

$(document).on('click', 'componentElement', function () {
    var parameterResult = "test";
    $.ajax({
        url: '/Index',
        type: 'get',
        data: {
            parameter: parameterResult 
        },
        success: function () {            
            <!-- here I need to reload -->
        }
    });
});

我尝试过location.reload(),但我必须只刷新这个div,而不是整个页面,也尝试过$('#mainDiv').load(' #mainDiv'),但仍然没有

【问题讨论】:

  • 您想使用 JQuery 传递 ViewData?那是行不通的(除非我在这里遗漏了一些东西)。 ViewData 和 Razor 代码在页面加载之前。页面加载后,它是纯 HTML 和 JS/JQuery。因此,您需要在 OnGet 上返回一个 JSon,并使用 JQuery 删除并添加回 div 以相应地对其进行格式化。如果可以的话,我会尝试与消息来源一起提供一个体面的答案。
  • @Cyber​​Claw 你理解得很好。我想用 ViewData 的更新值重新加载这个 div。

标签: c# jquery razor-pages


【解决方案1】:

Razor 评估视图并创建客户端看到的 HTML。例如,如果您检查 Chrome 上的源代码,您会注意到您的所有 Razor 代码都被标准 HTML 替换。

如果您想在页面加载后修改 HTML,您有 2 个选项。使用新数据重新加载页面,因此将创建新的 HTML 并重新评估新的条件,或者使用 JS/JQuery 在客户端修改页面。 JQuery 将无法访问 ViewData,这是纯 HTML / JS。由于您不想重新加载页面,这是唯一的方法。

从 HTML 中删除和添加内容的 JQuery 函数示例:

$(document).on('click', 'componentElement', function () {
    var parameterResult = "test";
    $.ajax({
        url: '/Home/OnGet/', //assuming controller would be Home
        type: 'POST', //if you are sending data, it's a POST
        dataType: "Json", //specify the datatype you are sending
        data: {
            parameter: parameterResult 
        },
        success: function (obj) { //notice I'm expecting an object back here
            $( "#mainDiv" ).empty(); //this will clear all the children inside the mainDiv  
            $( "#mainDiv" ).append("<h5<" + obj + " selected</h5>"); //this will add back the string you get your OnGet
        }
    });
});

下面是您的 OnGet 应该如何响应 ajax 请求:

public JsonResult OnGet(string parameter = "default") //I'll return a Json, so class needs to be JsonResult
{
    return Json(parameter);
}

【讨论】:

  • 非常感谢,我在使用此代码时遇到了一些问题(XSRF-TOKEN 等),但终于可以正常工作了。无论如何,它根本不能解决我的问题。 $('#mainDiv').append('....') append 函数中?并且此统计信息将具有许多取决于此 1 参数的值。也许这样做的好方法是为此 div 创建一个局部视图并在success(function() {}) 上刷新这个局部视图?
  • 是的,这可能是更好的选择。您可以使用 .load(url, data) 使用 jQuery 将另一个视图加载到 div 中。这是一个示例: $('#mainDiv').load(@(Html.Raw(Url.Action("ActionName", "ControllerName"))), parameterResult);只要该行在cshtml文件中(js文件不会加载剃刀),或者只是手动编写url。该请求可以获取您的 parameterResult 变量,并返回您的视图,因此您甚至不需要 ajax。
猜你喜欢
  • 2020-05-26
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-10-01
  • 2015-06-18
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多