C#MVC-重新加载(获取)PartialView会丢失hrefs上的完整URL参数

时间:2018-08-05 16:37:33

标签: c# asp.net-mvc

我从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才能调用共享点,我的问题是...。 重新加载部分视图后,如何确保我的“编辑按钮”链接的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>

1 个答案:

答案 0 :(得分:1)

您需要将此querystring项传递到操作方法,该操作方法将返回部分视图结果,并且在该操作方法内部,您将再次将其传递到部分视图,在此您将使用该视图创建编辑链接href值。

这是一个简单的示例,该示例使用ViewBagSPHostUrl参数的值传递给视图。如果您有视图模型,请使用该模型来传递值,而不要使用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方法来生成正确的action方法的相对链接值。在下面的示例中,我在剃刀视图中调用Url.Action方法,并将该结果(返回部分视图的action方法的url)作为html5数据属性值存储到我们的容器div中。

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

剃刀执行上述代码时,将生成如下所示的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方法就会将该值传递给您的部分视图操作方法,该方法将使用该值来创建编辑链接网址。