我如何从我的视图中运行一个方法,并让它返回到发送页面,这需要一个基于类别ID的查询字符串it's not sen
本文关键字:一个 于类别 ID 查询 sen it 字符串 not 视图 运行 我的 | 更新日期: 2023-09-27 18:19:18
作为一个预先说明,我最近转移到。net下的MVC,因此一些术语可能有点偏离,&我已经尽可能地删除了不相关的代码。
在web应用程序中,从我的视图中,我有一个循环,输出从视图模型传递的项目。对于特定的类别,视图模型由Items填充,类别ID通过查询字符串
发送。@model Web.Models.ItemViewModel
[html only - removed for brevity]
@foreach (var item in Model.Items)
{
<tr>
<td>@item.Name</td>
<td><a href="@Url.Action("/DeleteItem", new {id = item.ID})">remove</a></td>
</tr>
}
在我的控制器中,我有一个Index和DeleteItem的方法,如下所示:
public ActionResult Index(Guid categoryID, Type categoryType)
{
// populate items
return View(new ItemViewModel
{
// maps items
)};
}
public ActionResult DeleteItem(Guid id)
{
ItemService.Delete(id);
return View("Index");
}
当DeleteItem方法完成时,它返回到Index,尽管没有查询字符串,但我收到一个空白页-或一个错误页,说明类别ID未设置。理想的"Index"字符串应该是
www.domain.com/Items/ItemCategory?id=00000000-0000-0000-0000-000000000000&Type=MyCategoryType
我尝试了各种不同的方法,但都没有成功,包括:
返回到URI Referrer,最终试图返回删除页本身(不存在)
在删除项目之前,抓取它的类别ID和类别类型-这是有效的,但是单个项目可以属于多个类别和类别类型,所以这是一个不可靠的方法-因为它可能最终将最终用户从类别(A)发送到类别(B)和一个完全不同的视图。
将相关数据传递给Delete方法,例如:
public ActionResult DeleteItem (Guid id, Guid SendingCategoryID, ItemType SendingCategoryItemType)
, 1)看起来我传递了很多不必要的数据——其中一些数据在没有DB调用的情况下不能立即可用,2)在应用程序的生命周期内将变得完全不可维护。一个项目可以属于多个"类别"或"类别类型",一个"类别"可以属于多个"类别类型"。我甚至无法想象用这种技术调试一个问题会有多困难。
我的下一个方法是在不离开页面的情况下调用该方法。我完全不确定如何做到这一点,任何帮助或建议,甚至在如何表达我的问题,以获得一个体面的结果,从谷歌,我可以继续研究将是非常有帮助和感激。
在我看来,在您的情况下,传递类别(甚至是某种形式的更一般的返回位置参数)是完全有效的。当然,您可以通过AJAX删除而不离开页面,但额外的参数不应该是您这样做的原因。
我假设你使用RedirectToAction如果你有额外的参数
在没有必要数据的情况下显示Index
视图,您可能希望重定向到Index
操作:
[HttpPost]
public ActionResult DeleteItem(Guid id)
{
ItemService.Delete(id);
return RedirectToAction("Index");
}
另外,请确保DeleteItem
只与HTTP POST请求一起执行。更改数据应该只发生在POST请求上。这也意味着在你的索引页的删除链接将需要成为一个表单做POST。