C# 我是否需要控制器中每个不同操作的视图?
简单一点,这是我使用ASP.NET MVC的第一天 例如,在这里,我将向大厅添加一个表,然后我想再次显示表列表,这是我在索引视图中所做的 我是否需要创建一个与索引视图内容相同的AddTable视图 我试过了,但没用C# 我是否需要控制器中每个不同操作的视图?,c#,asp.net,asp.net-mvc-4,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 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();
}
}
您可以强制执行任何操作以呈现相同的视图,例如
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没有更改。您可以强制任何操作来呈现相同的视图,例如
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没有更改。如果操作将返回特定于该操作的视图,则只需要一个视图。但是,任何给定操作都可以返回许多
ActionResult
返回值。文件、原始文本内容、JSON、错误响应、重定向等
在这种特殊情况下,您似乎希望将用户重定向回索引
操作。这应该可以做到:
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()
方法将再次执行,这可能意味着再次访问数据库,而从技术上讲,这是不必要的。在大多数情况下,这不是问题,但是如果您必须对性能进行真正的微调,那么在某些情况下,使用第二种方法可能是值得的。只有当操作返回特定于该操作的视图时,您才需要一个视图。但是,任何给定操作都可以返回许多ActionResult
返回值。文件、原始文本内容、JSON、错误响应、重定向等
在这种特殊情况下,您似乎希望将用户重定向回索引
操作。这应该可以做到:
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()
方法将再次执行,这可能意味着再次访问数据库,而从技术上讲,这是不必要的。在大多数情况下,这不是问题,但是如果您必须对性能进行微调,那么在某些情况下,使用第二种方法可能是值得的。您可以创建两个视图。一个用于显示数据列表,另一个用于添加数据。
如果要在一个页面中设置两个操作,可以使用ajax。可以创建两个视图。一个用于显示数据列表,另一个用于添加数据。
如果您想在一个页面中设置这两个动作,可以使用ajax。您能为“奇数”给出一个假设情况吗?以及如何正确使用可以避免“导致”奇数。@AndyzSmith:例如,返回视图中的任何相对URL(包括默认的
BeginForm()
调用,这些调用没有明确指定操作)都会中断。如果有任何东西依赖于一个推荐人的URL,那就会改变。主要对我来说,这只是一个直观的URL问题。如果查看的是当前的表索引,则不应位于名为“”AddTable“
”的URL上。您能为“奇数”给出一个假设情况吗?以及如何正确使用可以避免“导致”奇数。@AndyzSmith:例如,返回视图中的任何相对URL(包括默认的BeginForm()
调用,这些调用没有明确指定操作)都会中断。如果有任何东西依赖于一个推荐人的URL,那就会改变。主要对我来说,这只是一个直观的URL问题。如果你正在查看当前的表索引,你不应该在一个名为“AddTable”
的URL上。谢谢大家,三个很好的答案。接受了那个似乎更完整的。其他两个投了赞成票。谢谢你们,三个很好的答案。接受了那个似乎更完整的。但还是投票支持了另外两个。