C# 控制器调用自身并传递值

C# 控制器调用自身并传递值,c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,如何将数据从控制器传递到自身 考虑这个例子: 我有一个由两部分组成的页面:(1)一个简单的html表单,带有两个文本框和一个提交按钮;(2)当按下第(1)部分中的按钮时更新的表格。发生这种情况时,表单中的数据必须追加到表的末尾。 在我看来,应该存在对象的列表。每次按下按钮时,都会使用两个参数调用控制器:对象的旧列表和文本框值。然后,控制器生成对象,将其添加到列表中,并将新列表传递给视图。将使用新数据呈现视图,并将行成功添加到表中。 然而,这需要重新加载页面,感觉有点不对劲 问题是,没有静态对象可

如何将数据从控制器传递到自身

考虑这个例子:

我有一个由两部分组成的页面:(1)一个简单的html表单,带有两个文本框和一个提交按钮;(2)当按下第(1)部分中的按钮时更新的表格。发生这种情况时,表单中的数据必须追加到表的末尾。 在我看来,应该存在对象的
列表。每次按下按钮时,都会使用两个参数调用控制器:对象的旧列表和文本框值。然后,控制器生成对象,将其添加到列表中,并将新列表传递给视图。将使用新数据呈现视图,并将行成功添加到表中。
然而,这需要重新加载页面,感觉有点不对劲

问题是,没有静态对象可以永久包含列表,或者至少在这些控制器自调用期间存在。如果有,我就不必传递整个列表(正如我所说,我甚至不能传递),只需传递新的文本框值。 我听说部分观点可以解决这个问题,但我不知道如何解决


我能做什么?

如果没有支持表单数据的数据库,可以使用数据保存列表

在控制器中,执行以下操作:

[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
}
[HttpPost]
public ActionResult AddToList(对象新建对象)
{
var list=SESSION[“list”]作为列表;
如果(list==null){
列表=新列表();
会话[“列表”]=列表;
}
list.add(newObject);
返回视图(列表);//假设视图是以列表为模型的强类型视图
}

至于部分视图,它们并不能单独解决重新加载页面的问题。解决了页面的可重用、自包含组件的问题。如果您不喜欢重新加载页面,那么可以将部分视图与Ajax调用一起使用,以便在添加新项时重新提取表

对于初学者,正如您所说,您希望在没有javascript的情况下实现这一点,我认为没有办法避免:
重新加载页面,这感觉有点不对。

也不确定局部视图如何工作,因为它们是从主视图渲染的,并且需要与模型相同或部分的数据,所以您需要在那里保存这些数据

您必须从控制器获取信息,并且控制器必须以某种方式获取此信息,因此在我看来,以下是您的选项:

  • 将第(2)部分放在表单中,这样在点击控制器时两部分都可用。模型将填充您需要的值,然后当您返回视图时,数据将为您提供

  • 在第(1)部分中保留一个隐藏的输入字段,其中包含创建列表所需的数据。它在概念上与选项#1类似,但我不太喜欢这种方法,您必须对该输入字段进行一些解析,这不是很优雅


  • 您也可以尝试使用会话或数据库,但我认为后者是一种过度使用,对性能有影响,所以我不这么认为。

    您不能使用客户端在第2部分中添加行而不使用服务器端吗?是的,这很容易用JavaScript实现,但因为我正在学习ASP.NET MVC,所以我想使用它的功能,如果可能的话。控制器自呼在哪里?我只看到一个返回视图的HTTPPOST调用。这是客户端>服务器>客户端。服务器>服务器调用在哪里?那么哪个选项是好的呢?或者是关于不同种类的坏事?第一个和第二个选项很笨拙,数据库很重。没有“正确”的方法吗?另外,谢谢你的明确回答。@NikaGamkrelidze我的正确答案是使用javascript:)我自己也不得不使用这两种解决方案,这取决于具体情况。如果你的目标是学习,那么为什么不全力以赴获得经验呢。如果这同样适用,并且您可以使用Session,我将使用Session。感谢您提供可能的解决方案和示例代码。