我如何从我的视图中运行一个方法,并让它返回到发送页面,这需要一个基于类别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)在应用程序的生命周期内将变得完全不可维护。一个项目可以属于多个"类别"或"类别类型",一个"类别"可以属于多个"类别类型"。我甚至无法想象用这种技术调试一个问题会有多困难。

我的下一个方法是在不离开页面的情况下调用该方法。我完全不确定如何做到这一点,任何帮助或建议,甚至在如何表达我的问题,以获得一个体面的结果,从谷歌,我可以继续研究将是非常有帮助和感激。

我如何从我的视图中运行一个方法,并让它返回到发送页面,这需要一个基于类别ID的查询字符串it's not sen

在我看来,在您的情况下,传递类别(甚至是某种形式的更一般的返回位置参数)是完全有效的。当然,您可以通过AJAX删除而不离开页面,但额外的参数不应该是您这样做的原因。

我假设你使用RedirectToAction如果你有额外的参数

在没有必要数据的情况下显示Index视图,您可能希望重定向到Index操作:

[HttpPost]
public ActionResult DeleteItem(Guid id)
{
    ItemService.Delete(id);
    return RedirectToAction("Index");
}

另外,请确保DeleteItem只与HTTP POST请求一起执行。更改数据应该只发生在POST请求上。这也意味着在你的索引页的删除链接将需要成为一个表单做POST。