如何将数据从控制器传递给自身?
考虑这个例子:
我有一个由两部分组成的页面:(1)一个简单的html表单,带有几个文本框和一个提交按钮;(2)一个表,当按下部分(1)的按钮时更新。当它发生时,表单中的数据必须附加到表的末尾。
在我看来,应该存在List
个对象。每次按下该按钮,控制器都会调用两个参数:旧的对象列表和文本框值。然后,控制器生成对象,将其添加到列表并将新列表传递给视图。使用新数据呈现视图,并将行成功添加到表中。
但是,这需要重新加载页面,这感觉有点不对。
问题是,没有可以永久包含列表的静态对象,或者至少在这些控制器自调用期间存在的静态对象。如果有这样的话,我就不必通过整个列表(正如我所说,我甚至无法做到),而只是新的文本框值。 我听说部分观点可以解决问题,但我不知道如何。
我该怎么办?
答案 0 :(得分:1)
如果您没有支持表单数据的数据库,则可以使用Session数据来保存列表。
在控制器中,执行以下操作:
[HttpPost]
public ActionResult AddToList(object newObject)
{
var list = Sesssion["List"] as List<Object>;
if (list == null) {
list = new List<Object>();
Session["List"] = list;
}
list.add(newObject);
return View(list); // Assuming the view is a strong-typed view with List<Object> as model
}
对于部分视图,它们并不能单独解决重新加载页面的问题。解决了页面的可重用,自包含组件的问题。如果您不喜欢重新加载页面,可以将部分视图与Ajax调用一起使用,以便在添加新项目时重新获取表格。 Here is an example
答案 1 :(得分:1)
对于初学者,正如你所说的,你想在没有javascript的情况下实现这一目标,我认为无法避免:reloading of the page and that feels kinda wrong.
不确定部分视图如何使事情有效,因为它们是从主视图渲染并需要相同或部分模型的,因此您需要在那里获取该数据。
您必须从控制器获取信息,并且控制器必须以某种方式获取此信息,因此我认为这些是您的选择:
将部分(2)保留在表单中,从而在您点击控制器时使这两个部分可用。模型将填入您需要的值,然后当您返回视图时,数据可供您使用。
在part(1)中保留一个隐藏的输入字段,其中包含创建列表所需的数据。它在概念上与选项#1类似,但我不太喜欢这种方法,你必须在该输入字段上进行一些解析,这不是很优雅。
您也可以尝试使用Session
或数据库,但我认为后者是一种过度杀伤并且对性能造成打击所以我不会这样做。