【问题标题】:Controller calling itself and passing a value控制器调用自身并传递值
【发布时间】:2014-03-12 06:53:18
【问题描述】:

如何将数据从控制器传递给自己?

考虑这个例子:

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

问题是,没有静态对象可以永久包含列表,或者至少在这些控制器自调用期间存在。如果有这样的话,我就不必传递整个列表(正如我所说,我什至做不到),而只需传递新的文本框值。 听说局部视图可以解决问题,但是不知道怎么解决。

我能做什么?

【问题讨论】:

  • 你不能使用客户端在不去服务器端的情况下将行添加到第 2 部分吗?
  • 是的,这可以通过 JavaScript 轻松实现,但由于我正在学习 ASP.NET MVC,所以如果可能的话,我想使用它的功能。
  • 控制器自调用在哪里?我只看到一个返回视图的 HTTP POST 调用。那是客户端>服务器>客户端。服务器 > 服务器调用在哪里?

标签: c# asp.net-mvc-3 razor


【解决方案1】:

对于初学者,正如你所说的你想在没有 javascript 的情况下实现这一点,我认为没有办法避免:reloading of the page and that feels kinda wrong.

也不确定部分视图如何使事情发挥作用,因为它们是从您的主视图渲染的,并且需要您的模型的相同或部分,因此您需要在那里拥有该数据。

您必须从控制器获取信息,并且控制器必须以某种方式获取此信息,以便我看到它,这些是您的选择:

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

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

您也可以尝试使用 Session 或数据库,但我认为后者过于矫枉过正并且会影响性​​能,所以我不会这样做。

【讨论】:

  • 那么哪个选项好呢?或者是关于不同种类的坏事?第一个和第二个选项很笨拙,数据库很重。没有“正确”的方法吗?另外,感谢您的明确回答。
  • @NikaGamkrelidze 对我来说正确的答案是使用 javascript :) 我不得不自己使用这两种解决方案,具体取决于具体情况。如果您的目标是学习,那么为什么不尝试一切来获得经验。如果这也适用并且您可以使用 Session,我将使用 Session。
【解决方案2】:

如果您没有支持表单数据的数据库,您可以使用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

【讨论】:

  • 感谢您提供可能的解决方案和示例代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多