Як я можу завантажити частковий вигляд усередині подання?


73

Я дуже плутаю цю часткову думку.

Я хочу завантажити частковий вигляд всередині мого основного перегляду.

Ось простий приклад.

Я завантажую Index.cshtml дії Index Index Homecontroller як головну сторінку.

У index.cshtml я створюю посилання через

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

у HomeController я додаю нову дію під назвою

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

у _LoadView.cshmtl у мене просто є

<div>
    Welcome !!
</div>

АЛЕ, під час запуску проекту index.cshtml відображається першим і показує мені посилання "Завантажити частковий вигляд". коли я натискаю на це, воно переходить до нової сторінки індексу візуалізації привітального повідомлення з _LoadView.cshtml в index.cshtml.

Що може бути не так?

Примітка: Я не хочу завантажувати сторінку через AJAX або не хочу використовувати Ajax.ActionLink.

Відповіді:


154

Якщо ви хочете завантажити частковий вигляд безпосередньо всередині основного вигляду, ви можете скористатися 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" />

працює нормально ... так що це означає, що якщо я хочу використовувати його з @ Html.ActionLink, його goona виступає як звичайний запит і відкриває паральний перегляд на новій сторінці? ...
patel.milanb

1
@ patel.milanb, точно. Html.ActionLink робить звичайний прив'язок у html, який просто виконує запит GET до даної URL-адреси, і він перенаправляє на нього браузер. Оскільки ви вказали його на дію Load, яка повертає лише частковий, браузер отримує перенаправлення та відображає цей частковий.
Дарін Димитров

О мій! Щиро дякую, що запитали і відповіли на це! Я намагався змусити це працювати годинами, так і не виправивши синтаксис. Останні годину-дві (плюс перерви) я намагався отримати цю версію від Даріна для роботи, але я залишив рядок "не забудь включити" і не міг повірити, що це змінить різницю між завантаженням цілу сторінку та завантаження у div (я очікував помилки, а не зміни відображення), але це сталося.
Дронц,

1
Привіт, у моєму сценарії я хочу перемикатися між коротким та розширеним видом. Я розмістив Ajax.ActionLinkу короткому поданні і встановив UpdateTargetIdдля батьківського ідентифікатора div. Тепер, коли я натискаю посилання, результат ajax замінює всю сторінку.
Shimmy Weitzhandler

1
Фантастична відповідь. Дякую @DarinDimitrov за такий ідеальний. Я була впевнена, що це ти, ще до того, як побачила твоє ім’я. :)
Мікайїл Абдуллаєв

15

У мене була точно така ж проблема, як у Леніеля. Я спробував виправлення, запропоновані тут і ще з десяток інших місць. Річ, яка нарешті спрацювала для мене, просто додала

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

до мого макета ...


Я також витрачаю години, щоб подолати цю проблему. У моєму шаблоні mvc4 за замовчуванням для "базової програми mvc" у мене є @ Scripts.Render ("~ / bundles / jquery"), але не @ Scripts.Render ("~ / bundles / jqueryval"). Тому я просто додаю другий і часткові подання починають відображатися на тій самій сторінці, а не на новій. Дякую.
user808128

навіть для мене це не спрацювало, поки я не імпортував ці два імпорти.
Niraj

5

Якщо ви робите це із @Html.ActionLink()завантаженням, то PartialView обробляється як звичайний запит при натисканні на елемент прив'язки, тобто завантажує нову сторінку з відповіддю методу PartialViewResult.
Якщо ви хочете завантажити його негайно, тоді ви використовуєте @Html.RenderPartial("_LoadView")або @Html.RenderAction("Load").
Якщо ви хочете зробити це під час взаємодії з користувачем (тобто клацнувши на посилання), вам потрібно скористатися AJAX ->@Ajax.ActionLink()


вищевказане рішення працює нормально ... так що це означає, що якщо я хочу використовувати його з @ Html.ActionLink, його goona виступає як звичайний запит і відкриває паральний перегляд на новій сторінці? просто хочу очистити свою думку частковим поглядом ...
patel.milanb

5

Для мене це спрацювало після того, як я завантажив ненав’язливу бібліотеку AJAX через NuGet:

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

Потім додайте у поданні посилання на jquery та ненав’язливий AJAX:

@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

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

Невеликий твік до вищезазначеного

@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");}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.