【问题标题】:C# MVC - Reloading (getting) PartialView losses full URL params on hrefsC# MVC - 重新加载(获取)部分视图在 ahrefs 上丢失完整的 URL 参数
【发布时间】:2018-08-05 16:37:33
【问题描述】:

我从 SharePoint 获取列表并将其保存到 C# 列表中。我将该列表发送到 PartialView 并执行 Foreach 以显示带有包含其 ID 的编辑按钮的项目。

        return PartialView("IRFList", items);

        <h5>@Html.ActionLink("Edit", "Edit", new { id = item.Id }, new { @class = "badge badge-primary editIRFBut" })</h5>

PartialView 加载到索引主体上。如果我单击编辑,让我编辑页面,一切正常。 我还有一个“新项目”按钮,它使用 $.post 来联系创建项目的 AddItem 控制器。成功后我重新加载部分视图 ->

        $.ajax({
            url: listUrl,
            type: "GET",
            dataType: "html",
            success: function (data) {
                $('.irfListPartial').html(data);
            },
        });

一切正常,但 PartialView 重新加载后我的链接按钮出现问题。

我的网址类似于“example.com?SPHostUrl=https.....”。当我第一次加载索引时,编辑按钮包含“?SPHostUrl”,但是当我重新加载 PartialView 时,它们会丢失 URL 的那部分。

我实际上需要该 URL 来调用 sharepoint,我的问题是.... 重新加载部分视图后,如何确保我的编辑按钮链接在其 URL 中包含 ?SPHostUrl?

编辑:根据 Shyju 的回答进行了更新以便于阅读。

    public ActionResult IRFList()
    {
        var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
        List<IRFItem> items = SharepointService.GetItems(spContext);
        ViewBag.SPHostUrl = SharePointContext.GetSPHostUrl(HttpContext.Request).AbsoluteUri;
        return PartialView("IRFList", items);
    }

对于部分编辑按钮

        <h5>@Html.ActionLink("Edit", "Edit", new { id = item.Id, SPHostUrl = ViewBag.SPHostUrl }, new { @class = "badge badge-primary editIRFBut" })</h5>

【问题讨论】:

  • 您需要将其发送到您的控制器并将其添加到链接参数中,或者在将 html 注入 .irfListPartial 之前在客户端执行此操作

标签: c# asp.net-mvc


【解决方案1】:

您需要将此查询字符串项传递给返回局部视图结果的操作方法,并在该操作方法内,您将再次将它传递给局部视图,您将使用它来创建您的编辑链接href 值。

这是一个简单的示例,它使用ViewBag 将SPHostUrl 参数的值传递给视图。如果您有一个视图模型,请使用它来传递值,而不是 ViewBag。

public ActionResult ListPartial(string SPHostUrl)
{
    var posts = db.Posts.ToList();
    ViewBag.SPHostUrl = SPHostUrl;
    return PartialView(posts);
}

在你的局部视图中

@model List<YourNamespace.Post>
<div>
    @foreach (var item in Model)
    {
        <h4>@item.Title<h4>
        <h5>@Html.ActionLink("Edit", "Edit",
                       new { id = item.Id, SPHostUrl = ViewBag.SPHostUrl },
                       new { @class = "badge badge-primary editIRFBut" }) 
        </h5>    
    }
</div>

现在您要做的就是在进行 ajax 调用时发送 SPHostUrl 查询字符串。为此,您可以再次使用相同的方法将 SPHostUrl 值传递给主视图(我们在其中通过 ajax 加载部分视图结果)

public ActionResult Index(string spHostUrl)
{
   ViewBag.SpHostUrl = spHostUrl;
   return View();
}

这里我再次使用ViewBag 在操作方法和视图之间传递数据。如果您有视图模型,请向其中添加一个新属性并使用该属性将参数值传递给您的视图。

现在,在您看来,在构建 ajax 调用所需的 url 时使用此 ViewBag 项。我喜欢依靠Url.Action 方法来生成正确的相对链接值到操作方法。在下面的示例中,我在我的 razor 视图中调用 Url.Action 方法并将其结果(返回部分视图的操作方法的 url)作为 html5 数据属性值存储到我们的容器 div。

<div class="irfListPartial" 
     data-url="@Url.Action("ListPartial",new { spHostUrl=ViewBag.SpHostUrl})">
</div>

当 razor 执行上述代码时,会生成如下 HTML 标记。

<div class="irfListPartial" data-url="/Posts/ListPartial"></div>

在进行ajax调用时,我们要做的就是读取div的这个data属性值并将其用于ajax调用。

var $partial = $('.irfListPartial');
var listUrl = $partial.data("url");

$.ajax({
         url: listUrl,               
         success: function (data) {
           $partial.html(data);
         }
});

现在,只要使用 spHostUrl 查询字符串调用您的主要操作方法,您的 ajax 方法就会将该值传递给您的部分视图操作方法,该方法将使用该值来创建编辑链接 url。

【讨论】:

  • 太棒了!非常感谢。我只将 SPHostUrl = ViewBag.SPHostUrl 添加到我的 ActionLink 中(在设置 ViewBag 之后)并且它可以工作(我使用 ajax get 重新加载)。老实说,我不知道第二个参数会添加查询字符串。再次感谢,工作就像一个魅力^^。编辑:索引不需要 SPHostUrl,因为访问该页面的唯一方法是单击已经具有 ?SPHostUrl="link" 的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2017-10-31
相关资源
最近更新 更多