如何在视图内加载局部视图?


73

我对这种局部看法非常困惑。

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

这是简单的例子。

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

在index.cshtml中,我通过创建链接

@Html.ActionLink("load partial view","Load","Home")

在HomeController中,我添加了一个名为

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

在_LoadView.cshmtl中,我只是

<div>
    Welcome !!
</div>

但是,在运行项目时,index.cshtml会首先呈现并显示链接“ Load Partial View”。当我单击它时,它将转到新页面,以将来自_LoadView.cshtml的欢迎消息呈现为index.cshtml。

有什么事吗

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

Answers:


154

如果要直接在主视图中加载局部视图,则可以使用Html.Action帮助器:

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

或者,如果您不想执行“加载”操作,请使用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" />

工作正常...所以这意味着如果我想将其与@ Html.ActionLink一起使用,它的goona可以作为普通请求并在新页面中打开面板视图?...
patel.milanb

1
完全是@ patel.milanb。Html.ActionLink在html中呈现一个普通锚,该锚简单地对给定的url执行GET请求,并将浏览器重定向到该url。因为您已将其指向仅返回部分内容的Load操作,所以浏览器将被重定向并显示该部分内容。
Darin Dimitrov

天啊!非常感谢您提出和回答此问题!我一直在努力使其工作数小时,但从未完全正确使用语法。在最后一两个小时(加上休息时间),我试图从Darin那里获取此版本,但我没有提到“别忘了包含”这一行,并且不相信这样做会在加载之间产生区别整个页面并加载到div中(我期望出现错误,而不是显示更改),但确实如此。
德隆兹2011年

1
嗨,在我的场景中,我想在短视图和扩展视图之间切换。我Ajax.ActionLink在短视图中放置了一个,并将设置UpdateTargetId为父div的ID。现在,当我单击链接时,ajax结果将替换整个页面。
Shimmy Weitzhandler

1
很棒的答案。谢谢@DarinDimitrov这么完美的一个。我确定是你,甚至没有看到你的名字。:)
Mikayil Abdullayev 2014年

15

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

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

到我的布局...


我还花了几个小时来解决这个问题。在“基本mvc应用程序”的默认mvc4模板中,我有@ Scripts.Render(“〜/ bundles / jquery”),但没有@ Scripts.Render(“〜/ bundles / jqueryval”)。因此,我只添加第二个视图和部分视图开始在同一页面上呈现,而不是在新页面上呈现。谢谢。
user808128 2015年

甚至对我来说,直到我导入了这两个导入,它才起作用。
尼拉伊,2015年

5

如果使用a@Html.ActionLink()进行加载,则在单击锚元素时将PartialView作为正常请求进行处理,即使用PartialViewResult方法的响应来加载新页面。
如果要立即加载,请使用@Html.RenderPartial("_LoadView")@Html.RenderAction("Load")
如果要在用户交互(例如单击链接)时执行此操作,则需要使用AJAX->@Ajax.ActionLink()


上面的解决方案工作正常...所以这意味着如果我想将其与@ Html.ActionLink一起使用,它的goona充当普通请求并在新页面中打开面板视图?只是想用局部视图来清除我的想法...
patel.milanb

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 ActionLinkdiv

@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。谢谢你让我省了很多麻烦。
2015年

2

如果您想在视图中填充部分视图的内容,则可以使用

@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

小tweek以上

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

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

1

RenderParital更好地用于性能。

{@Html.RenderPartial("_LoadView");}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.