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

时间:2013-09-19 16:11:45

标签: c# asp.net asp.net-mvc-4

简单一点,它实际上是我使用ASP.NET MVC的第一天

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

我是否需要创建一个与索引视图具有相同内容的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();
    }
}

3 个答案:

答案 0 :(得分:2)

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

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

潜在问题(可能不适合您)这里的网址现在看起来像/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没有更改。

答案 1 :(得分:2)

如果操作将返回特定于该操作的视图,则只需要一个视图。但是,有许多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);
}

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

与服务器端代码的主要区别在于,在第二种情况下,实际的Index()方法将再次执行,这可能意味着另一次访问数据库,其中一个技术上不是没必要。在大多数情况下,这不是一个问题,但如果你必须真正微调你的表现,那么在某些情况下使用第二种方法可能值得。

答案 2 :(得分:0)

你可以提出两个观点。一个用于显示数据列表,另一个用于添加数据。 如果要在一个页面中设置两个动作,可以使用ajax。