Teilansicht, die nicht aktualisieren
Ich habe eine Teilansicht auf eine cshtml-Seite wie folgt :-
@model MvcCommons.ViewModels.CompositeViewModel
@{
ViewBag.Title = "Edit";
}
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Article</legend>
@Html.HiddenFor(model => model.ArticleViewModel.Article.ArticleID)
<div class="editor-label">
@Html.LabelFor(model => model.ArticleViewModel.Article.CategoryID, "Category")
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.ArticleViewModel.Article.CategoryID, (SelectList)ViewBag.CategoryID)
@Html.ValidationMessageFor(model => model.ArticleViewModel.Article.CategoryID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ArticleViewModel.Article.ArticleTitle)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ArticleViewModel.Article.ArticleTitle)
@Html.ValidationMessageFor(model => model.ArticleViewModel.Article.ArticleTitle)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ArticleViewModel.Article.ArticleDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ArticleViewModel.Article.ArticleDate)
@Html.ValidationMessageFor(model => model.ArticleViewModel.Article.ArticleDate)
</div>
@Html.HiddenFor(model => model.PageViewModel.Page.PageTitle, new { id = "PageTitle" })
@Html.HiddenFor(model => model.PageViewModel.Page.PageAction, new { id = "PageAction" })
@Html.HiddenFor(model => model.ArticleViewModel.Article.ArticleID, new { id = "ArticleID" })
<div class="ImageGallery">
@Html.Partial("~/Views/Shared/ImageGallery.cshtml", Model)
</div>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
Den ImageGallery.cshtml Partial View ist wie folgt :-
@model MvcCommons.ViewModels.CompositeViewModel
@{
ViewBag.Title = "Modal image uploader";
}
<script type="text/javascript">
var pageTitle = $('#PageTitle').val();
var pageAction = $('#PageAction').val();
var id = $('#ArticleID').val();
$(document).ready(function () {
$('.modal_block').click(function (e) {
$('#tn_select').empty();
$('.modal_part').hide();
});
$('#modal_link').click(function (e) {
$('.modal_part').show();
var context = $('#tn_select').load('/Upload/UploadImage?Page=' + pageTitle + '&Action=' + pageAction + '&id=' + id, function () {
initSelect(context);
});
e.preventDefault();
return false;
});
$('#delete_images').click(function (e) {
var sList = "";
$('input[type=checkbox]').each(function () {
var sThisVal = (this.checked ? this.value : "");
sList += (sList == "" ? sThisVal : "," + sThisVal);
});
$.ajax({
url: "/Upload/DeleteImages?IDs=" + sList + '&Page=' + pageTitle + '&Action=' + pageAction + '&id=' + id,
data: sList,
cache: false,
type: "POST",
dataType: "json"
});
reloadGallery();
return false;
});
function reloadGallery() {
$.ajax({
type: "GET",
url: '/Upload/Index/',
data: "{}",
cache: false,
dataType: "html",
success: function (data)
{ $().html(data); }
})
}
});
</script>
<div class="modal_block modal_part"></div>
<div class="modal_dialog modal_part" id="tn_select"></div>
<h2>List of images</h2>
<p>
This page contains the list of all uploaded images.
</p>
@if (Model.ImageViewModel.Images.Count > 0)
{
<div class="imageContainer">
<div class="div-table">
<div class="div-table-row-title">
<div class="div-table-col">Image</div>
<div class="div-table-col">Image Name</div>
</div>
</div>
}
</div>
<div class="DeleteImages">
<a href="#" id="delete_images">Delete Selected Images.</a>
</div>
}
else
{
<div class="imageCenter">
No images have been uploaded so far.
</div>
}
<p>
<a href="#" id="modal_link">Click here to open modal dialog.</a>
</p>
<div class="clear"></div>
Hier ist der code in den Controller zu löschen der Bilder:-
[HttpPost]
public ActionResult DeleteImages(string IDs)
{
_Page = Request.QueryString["Page"];
_Action = Request.QueryString["Action"];
_ItemID = Convert.ToInt32(Request.QueryString["id"]);
Generics.PageIDS currentPage = (Generics.PageIDS)Enum.Parse(typeof(Generics.PageIDS), _Page);
_PageID = Convert.ToInt32(currentPage);
string[] sepImageIds = IDs.Split(',');
foreach (string strImageId in sepImageIds)
{
imageViewModel.DeleteFromXML(strImageId);
}
return RedirectToAction(_Action, _Page, new { id = _ItemID });
}
Alles funktioniert in dieser Teilansicht, außer wenn ich ein Bild löschen, das löschen richtig gemacht, aber wenn der code übergeben wird, zurück zu der Ansicht, die Teilweise Ansicht wird nicht aktualisiert.
Gibt es etwas, was ich bin fehlt?
Dank für Eure Hilfe und Zeit!
------------------UPDATE---------------------------------------------
Dies ist das Bearbeiten von Controller-Aktion, nachdem der Löschvorgang beendet wurde :-
public ActionResult Edit(int id = 0)
{
articleViewModel.Article = unitOfWork.ArticleRepository.GetByID(id);
pageViewModel.Page.PageTitle = "Article";
pageViewModel.Page.PageAction = "Edit";
if (articleViewModel.Article == null)
{
return HttpNotFound();
}
PopulateDropDownList(articleViewModel.Article.CategoryID);
viewModel.ArticleViewModel = articleViewModel;
int ImageCount = 0;
imageViewModel.Images = imageViewModel.PopulateFromXML(pageViewModel.GetPageID(_PageName), id, out ImageCount).ToList();
viewModel.ImageViewModel = imageViewModel;
viewModel.PageViewModel = pageViewModel;
return View(viewModel);
//return Json(viewModel, JsonRequestBehavior.AllowGet);
}
Überprüfen Sie diesen link für "Ein Zirkelbezug erkannt wurde beim serialisieren eines Objekts" Fehler: "blog.davebouwman.com/2011/12/08/... und stackoverflow.com/questions/2002940/...
InformationsquelleAutor Johann | 2012-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es ist, weil alle teilweise Ansichten zwischengespeichert werden standardmäßig, was ich tun würde, ist die Erstellung einer Methode im controller aus, um eine ActionResult wie so, mit den Ausgabe-cache-Attribut auf 0, so dass es nicht im cache
Ich würde eine id, um Ihre imageGalleryDiv, ändern Sie Ihre reloadGallery Methode zum laden der Teilansicht auf onload-Ereignis und entfernen Sie die @Html.Teilweise wie so
So, Ihr teilweise die Ansicht manuell injiziert/aktualisiert via jquery und es wird nicht zwischengespeichert werden.
Cheers
Kein Kopfgeld ??? 🙂
InformationsquelleAutor Joshscorp
Müssen Sie rufen Sie die
reloadGallery
Funktion, sobald Ihr LÖSCHEN ajax-Aufruf erfolgreich ist, wird die in der Erfolgs-callback:Nicht zu erwähnen, dass Ihr
DeleteImages
Aktion nicht wieder irgendwelche JSON, so sollten Sie entfernen dasdataType: 'json'
wechseln. Sie scheinen Umleitung am Ende derDeleteImages
Aktion. Sind Sie sicher, dass Sie umleiten zu einer controller-action, liefert einen teilweise?Auch statt der Zündung noch ein AJAX-request in Ihrem
reloadGallery
Methode, warum nicht einfachDeleteImages
Aktion " zurück, die partielle und innerhalb dersuccess
update aufrufen, den entsprechenden Abschnitt von Ihrem DOM mit der.html
Methode?Sie benötigen Modelle anzeigen, können Sie JSON serialisieren von Objekten mit Zirkelverweisen.
Ich bin mit ViewModels, bin ich wieder ein CompositeViewModel
Sie müssen loszuwerden, alle möglichen zirkulären Referenzen, die Sie vielleicht in dieser Ansicht-Modell. Zum Beispiel, wenn Sie haben eine Eigenschaft, die in dieser Ansicht Modell, in dem Sie haben direkt gespeichert, Ihr domain-Modell, dann könnte dies das problem sein. Modelle ansehen sollten keine Verweise auf Domänen-Modelle.
Darin ich bin neu, um all dies MVC und Jquery-Sache. Was meinst du mit domain Modell? Ist es das Modell, dass ich immer der Ansicht-Modell aus? Zum Beispiel habe ich ein Bild Modell, und dann ein Bild von "ViewModel", "erbt" das Bild aus. Ist das schlimm für Zirkelbezug? Ich habe auch ein CompositeViewModel, und ich bin Instanziierung 4 ViewModels. Ist das schlimm Codierung? Ich brauchte, um einen Verweis für die Seite, das Bild und der Artikel in der Ansicht, dass ist der Grund, warum ich das Composite-ViewModel
InformationsquelleAutor Darin Dimitrov
Denke ich, es wäre in deinem ajax-Aufruf
entfernen der Daten: "{}" oder ersetzen Sie es mit den Daten: {}
HOLEN Sie sich in der Theorie ist idempotent, so das caching sollte aktiviert sein, standardmäßig
InformationsquelleAutor feskr