Обновление PartialView mvc 4
Эй! Как я могу обновить частичное представление с помощью данных из модели? В первый раз, когда страница загружается, она работает правильно, но не тогда, когда я вызываю ее из действия. Структура, которую я создал, выглядит следующим образом:
В любом месте на мой взгляд:
@{ Html.RenderAction("UpdatePoints");}
Мой PartialView "UpdatePoints":
<h3>Your points are @ViewBag.points </h3>
На контроллере у меня есть:
public ActionResult UpdatePoints()
{
ViewBag.points = _Repository.Points;
return PartialView("UpdatePoints");
}
Спасибо за помощь!
Обновить
Спасибо всем за вашу помощь! Наконец, я использовал JQuery/AJAX, как вы предложили, передавая параметр с использованием модели.Итак, в JS:
$('#divPoints').load('/Schedule/UpdatePoints', UpdatePointsAction);
var points= $('#newpoints').val();
$element.find('PointsDiv').html("You have" + points+ " points");
В Контроллере:
var model = _newPoints;
return PartialView(model);
В
<div id="divPoints"></div>
@Html.Hidden("newpoints", Model)
4 ответа:
Итак, скажем, у вас есть представление с PartialView, которое должно быть обновлено нажатием кнопки:
<div class="target"> @{ Html.RenderAction("UpdatePoints");} </div> <input class="button" value="update" />
Существует несколько способов сделать это. Например, вы можете использовать jQuery:
<script type="text/javascript"> $(function(){ $('.button').on("click", function(){ $.post('@Url.Action("PostActionToUpdatePoints", "Home")').always(function(){ $('.target').load('/Home/UpdatePoints'); }) }); }); </script>
PostActionToUpdatePoints
является ли вашAction
с[HttpPost]
атрибутом, который вы используете для обновления точекЕсли вы используете логику в своем действии UpdatePoints() для обновления точек, возможно, вы забыли добавить к нему атрибут [HttpPost]:
[HttpPost] public ActionResult UpdatePoints() { ViewBag.points = _Repository.Points; return PartialView("UpdatePoints"); }
Вы также можете попробовать это.
$(document).ready(function () { var url = "@(Html.Raw(Url.Action("ActionName", "ControllerName")))"; $("#PartialViewDivId").load(url); setInterval(function () { var url = "@(Html.Raw(Url.Action("ActionName", "ControllerName")))"; $("#PartialViewDivId").load(url); }, 30000); //Refreshes every 30 seconds $.ajaxSetup({ cache: false }); //Turn off caching });
Он делает начальный вызов для загрузки div,а затем последующие вызовы находятся на 30-секундном интервале.
В разделе контроллер можно обновить объект и передать его в частичное представление.
public class ControllerName: Controller { public ActionResult ActionName() { . . // code for update object . return PartialView("PartialViewName", updatedObject); } }
Спасибо всем за вашу помощь! Наконец, я использовал JQuery / AJAX, как вы предлагали, передавая параметр с помощью model.
Итак, в JS:
$('#divPoints').load('/Schedule/UpdatePoints', UpdatePointsAction); var points= $('#newpoints').val(); $element.find('PointsDiv').html("You have" + points+ " points");
В Контроллере:
var model = _newPoints; return PartialView(model);
В Поле Зрения
<div id="divPoints"></div> @Html.Hidden("newpoints", Model)
Контроллер:
public ActionResult Refresh(string ID) { DetailsViewModel vm = new DetailsViewModel(); // Model vm.productDetails = _product.GetproductDetails(ID); /* "productDetails " is a property in "DetailsViewModel" "GetProductDetails" is a method in "Product" class "_product" is an interface of "Product" class */ return PartialView("_Details", vm); // Details is a partial view }
На странице yore index вы должны иметь ссылку Обновить:
<a href="#" id="refreshItem">Refresh</a>
Этот скрипт также должен быть на вашей индексной странице:
<script type="text/javascript"> $(function () { $('a[id=refreshItem]:last').click(function (e) { e.preventDefault(); var url = MVC.Url.action('Refresh', 'MyController', { itemId: '@(Model.itemProp.itemId )' }); // Refresh is an Action in controller, MyController is a controller name $.ajax({ type: 'GET', url: url, cache: false, success: function (grid) { $('#tabItemDetails').html(grid); clientBehaviors.applyPlugins($("#tabProductDetails")); // "tabProductDetails" is an id of div in your "Details partial view" } }); }); });