所以我实际上自己设法解决了这个问题。这似乎不是正确的方法,但目前已经足够了。
在我的剃须刀看来,我最终得到了:
<h2>Image on pages</h2>
<input id="PageIdToRemove" name="PageIdToRemove" value="0" type="hidden" />
<input id="RemoveXMap" name="RemoveXMap" value="" type="hidden" />
<table class="table table-striped">
<tr>
<th>Page title</th>
<th>Image order</th>
<th>Actions</th>
</tr>
@foreach (var item in Model.ImagePagesXMap) {
<tr>
<td>@item.PageContents.PageTitle</td>
<td>@item.ImageOrder</td>
<td><button class="btn btn-danger js-button-removexmap" data-buttonvalue="@item.PageContents.PageId">
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
Remove image from page</button></td>
</tr>
}
</table>
<h2>Add this image to another page</h2>
<div class="form-group">
<label for="PageId">Page</label>
@Html.DropDownList("PageId", (IEnumerable<SelectListItem>)ViewBag.Pages, String.Empty, new { @class="form-control"})
</div>
<div class="form-group">
<label for="ImageOrder">Order on page</label>
<input type="number" id="ImageOrder" name="ImageOrder" class="form-control" />
</div>
<hr />
<p><input type="submit" name="AddXMap" id="AddXMap" value="Add to page" class="btn btn-success" /> | @Html.ActionLink("Cancel", "Index", null, new { @class = "btn btn-default" })</p>
<script type="text/javascript">
$(function () {
$('.js-button-removexmap').click(function () {
$('#PageIdToRemove').val($(this).data('buttonvalue'));
$('#RemoveXMap').val('1');
$('form').submit();
});
});
</script>
这里的大部分代码实际上是删除交叉映射的图像。
在这种情况下,它设置的值为
#PageIdToRemove
是在按钮元素的数据部分指定的项id,也是RemoveXMap的值。
在控制器中,我有:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(SiteImage siteimage, string AddXMap, string Save, int ImageOrder, int PageId, string RemoveXMap, int PageIdToRemove)
{
if (!String.IsNullOrEmpty(AddXMap))
{
if (PageId > 0)
{
var xmapAdd = new MyLibrary.BLL.GetPageImageXMap();
xmapAdd.AddImageXMap(siteimage.ImageId, PageId, ImageOrder);
var imageQuery = new MyLibrary.BLL.GetImagesQuery();
siteimage = imageQuery.GetImage(siteimage.ImageId);
}
}
if (!String.IsNullOrEmpty(RemoveXMap))
{
var xmapRemove = new MyLibrary.BLL.GetPageImageXMap();
xmapRemove.RemoveImageXMap(siteimage.ImageId, PageIdToRemove);
var imageQuery = new MyLibrary.BLL.GetImagesQuery();
siteimage = imageQuery.GetImage(siteimage.ImageId);
}
if (!String.IsNullOrEmpty(Save))
{
if (ModelState.IsValid)
{
db.Entry(siteimage).State = EntityState.Modified;
db.SaveChanges();
}
}
ViewBag.Pages = new SelectList(db.PageContents, "PageId", "PageTitle");
return View(siteimage);
}
我的想法是
siteimage
最初返回的内容与发布的内容来自相同的上下文,因此不需要刷新。所以这段代码:
var imageQuery = new MyLibrary.BLL.GetImagesQuery();
siteimage = imageQuery.GetImage(siteimage.ImageId);
实际上,使用新保存的xmap数据重新加载siteimage。(因为我没有编辑站点图像,所以我只是使用它的imageid来添加或删除xmap)
然后将此视图传递回视图。这是否是最好的方法(可能不是)是另一个问题。如果有人想建议其他解决方案,那也很酷。