我是否需要控制器中每个不同操作的视图

本文关键字:操作 视图 是否 控制器 | 更新日期: 2023-09-27 18:31:56

很简单,这实际上是我第一天使用 MVC ASP.NET

例如,在这里,我要向大厅添加一个表,然后我想再次显示表列表,我在索引视图中这样做。

是否需要创建与索引视图内容相同的 AddTable 视图?

试过这个,但没有用。

public class PokerController : Controller
{
    Lobby L;
    // GET: /Poker/
    public PokerController()
    {
        L = Lobby.Instance;
    }
    public ActionResult Index()
    {
        return View(L.Tables);
    }
    public void AddTable()
    {
        L.Tables.Add(new Table(3));
        this.Index();
    }
}

我是否需要控制器中每个不同操作的视图

仅当操作要返回特定于该操作的视图时,才需要一个视图。 但是,任何给定的操作都可以返回许多ActionResult返回值。 文件、原始文本内容、JSON、错误响应、重定向等。

在这种特殊情况下,您似乎希望将用户重定向回Index操作。 这应该可以解决问题:

public ActionResult Index()
{
    return View(L.Tables);
}
public ActionResult AddTable()
{
    L.Tables.Add(new Table(3));
    return RedirectToAction("Index", "Poker");
}

如果您不希望它是重定向,而是想显式返回该视图,这应该有效:

public ActionResult Index()
{
    return View(L.Tables);
}
public ActionResult AddTable()
{
    L.Tables.Add(new Table(3));
    return View("Index", L.Tables);
}

从用户的角度来看,两者之间的主要区别在于,在第一种情况下,他们看到的URL仍将"/Poker/Index",而在第二种情况下,他们会看到"/Poker/AddTable" 。 在大多数情况下,前者是首选,因为如果您不知道后者可能会导致奇怪的行为。

从服务器端代码的角度来看,主要区别在于,在第二种情况下,实际的Index()方法将再次执行,这可能意味着在技术上不需要再次访问数据库。 在大多数情况下,这不是问题,但是如果您必须真正微调性能,那么在某些情况下可能值得使用第二种方法。

您可以强制任何操作呈现相同的视图,例如

public ActionResult AddTable()
{
    L.Tables.Add(new Table(3));
    return View("Index", L.Tables);   
}

这里的潜在问题(可能不适合您)是您的 URL 现在看起来像 /AddTable .通常,依靠适当的数据存储并使用URL重定向是一个更好的主意,例如

public ActionResult Index()
{
    return View(L.Tables);
}
public void AddTables()
{
    L.Tables.Add(new Tables(3));
    L.SaveToDB(); // just an example
    RedirectToAction("Index");
}

因此,表已添加,并且 URL 未更改。

您可以创建两个视图。 一个用于显示数据列表,另一个用于添加数据。如果要在一个页面中设置这两个操作,可以使用 Ajax。