如何在视图中加载部分视图?

73

我对这个局部视图非常困惑。

我想在我的主视图中加载一个局部视图。

这里是一个简单的例子。

我正在将Homecontroller Index操作的Index.cshtml作为主页面进行加载。

在index.cshtml中,我通过创建链接来实现:

@Html.ActionLink("load partial view","Load","Home")
在HomeController中,我正在添加一个名为的新Action。
public PartialViewResult Load()
{
    return PartialView("_LoadView");
}

在_LoadView.cshmtl中,我遇到了一个

<div>
    Welcome !!
</div>

然而,当我运行这个项目时,index.cshtml首先呈现,并显示链接“加载局部视图”。但是当我单击它时,它会跳转到新页面,而不是将_LoadView.cshtml中的欢迎消息呈现到index.cshtml中。

可能出了什么问题?

注意:我不想通过AJAX加载页面,也不想使用Ajax.ActionLink。

7个回答

155

如果您想直接在主视图中加载部分视图,可以使用 Html.Action 助手:

@Html.Action("Load", "Home")

或者,如果您不想通过Load操作,可以使用HtmlPartialAsync助手:

@await Html.PartialAsync("_LoadView")

如果你想使用 Ajax.ActionLink,请用下面的代码替换你的Html.ActionLink

@Ajax.ActionLink(
    "load partial view", 
    "Load", 
    "Home", 
    new AjaxOptions { UpdateTargetId = "result" }
)

当然,你需要在页面中包含一个容器来显示这个部分:

<div id="result"></div>

同时不要忘记包含:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>

在你的主视图中启用Ajax.*助手。并确保在你的web.config文件中启用了非侵入式JavaScript(默认情况下应该已经启用):

<add key="UnobtrusiveJavaScriptEnabled" value="true" />

1
@patel.milanb,没错。Html.ActionLink在HTML中呈现一个普通的锚点,它只是执行一个GET请求到给定的URL并将浏览器重定向到该URL。因为你已经将其指向了仅返回部分视图的Load操作,所以浏览器被重定向并显示了这个部分视图。 - Darin Dimitrov
1
嗨,在我的情况下,我想在短视图和扩展视图之间切换。我在短视图中放置了一个 Ajax.ActionLink,并将 UpdateTargetId 设置为父 div 的 id。现在当我单击链接时,ajax 结果会替换整个页面。 - Shimmy Weitzhandler
帮助您达到50万。 - user2537701
1
非常棒的回答。谢谢@DarinDimitrov提供如此完美的答案。在我看到你的名字之前,我就确定是你了。 :) - Mikayil Abdullayev
正如@Scott所建议的那样,需要导入这两个@Scripts.Render(“〜/bundles/jquery”)和@Scripts.Render(“〜/bundles/jqueryval”),以便在同一页面上呈现部分页面的Ajax.Action链接。 - Niraj
显示剩余4条评论

15

我和Leniel遇到了完全相同的问题。我尝试了这里和其他十几个地方建议的修复方法。最终对我有用的是简单地添加了

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")

到我的布局...


我也花了好几个小时来解决这个问题。在我的默认mvc4模板中,对于“基本mvc应用程序”,我有@Scripts.Render(“〜/bundles/jquery”),但没有@Scripts.Render(“〜/bundles/jqueryval”)。所以我只是添加了第二个,并且部分视图开始在同一页上呈现而不是新的一页。谢谢。 - user808128
即使对我来说,在导入这两种引用之前它也无法工作。 - Niraj

5

我在通过 NuGet 下载 AJAX Unobtrusive 库之后,这个方法对我有效:

 Search and install via NuGet Packages:   Microsoft.jQuery.Unobtrusive.Ajax

然后在视图中添加对jQuery和AJAX Unobtrusive的引用:

@Scripts.Render("~/bundles/jquery")
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"> </script>

下面是Ajax的ActionLink和我们想要呈现结果的div:
@Ajax.ActionLink(
    "Click Here to Load the Partial View", 
    "ActionName", 
    null, 
    new AjaxOptions { UpdateTargetId = "toUpdate" }
)

<div id="toUpdate"></div>

我曾经在YouTube上跟着教程实现过这个,但我没有安装Microsoft.jQuery.Unobtrusive.Ajax。尽管我已经安装了jquery.unobstrusive-ajax.min.js。谢谢你,你帮我省去了很多麻烦。 - Dev

5

如果你使用@Html.ActionLink(),那么当点击一个锚元素时,加载PartialView会像处理普通请求一样进行,即加载PartialViewResult方法的响应作为新页面。
如果你想立即加载它,那么你可以使用@Html.RenderPartial("_LoadView")或者@Html.RenderAction("Load")
如果你想在用户交互时(比如点击链接)进行加载,则需要使用AJAX --> @Ajax.ActionLink()


以上解决方案运行良好...这意味着如果我想在@Html.ActionLink中使用它,它将作为普通请求进行操作并在新页面中打开部分视图?只是想澄清我的部分视图的想法... - patel.milanb

5
如果您想在视图中填充局部视图的内容,可以使用以下方法:
@Html.Partial("PartialViewName")

或者
{@Html.RenderPartial("PartialViewName");}

如果您想发起服务器请求并处理数据,然后返回填充有该数据的部分视图到您的主视图中,您可以使用

...
    @Html.Action("Load", "Home")
...

public PartialViewResult Load()
{
    return PartialView("_LoadView");
}

如果您希望用户点击链接后填充部分视图的数据,可以使用以下方法:

@Ajax.ActionLink(
    "Click Here to Load the Partial View", 
    "ActionName", 
    "ControlerName",
    null, 
    new AjaxOptions { UpdateTargetId = "toUpdate" }
)

1

使用RenderPartial可以提高性能。

{@Html.RenderPartial("_LoadView");}

1

对上述内容进行小调整

@Ajax.ActionLink(
    "Click Here to Load the Partial View", 
    "ActionName", 
    "ControlerName",
    null, 
    new AjaxOptions { UpdateTargetId = "toUpdate" }
)

<div id="toUpdate"></div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接