如何将列表从Controller传递给View?

时间:2014-01-17 21:51:24

标签: c# asp.net-mvc razor

这是我尝试过的:

在控制器中:

public ActionResult Detail()
{
     List<string> list = new List<String>();
     return View(list);
}

从细节来看:

@model dynamic
<!-- some HTML -->
<script>
     @Model.add(document.getElementById("input_box").value);
</script>

问题是,智能不检测传入的对象是否为List,因此@ Model.add不起作用。

我的目标是将一个列表传递到视图中,这样我就可以从用户输入中收集数据,然后在我的控制器中使用该数据列表。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

使用静态类型模型可以解决当前问题:

@model List<string>
<!-- some HTML -->
<script>
     @Model.Add(document.getElementById("input_box").value);
</script>

然而,当编译器抱怨它不知道document是什么时,你会很快碰到另一堵墙。这是因为Razor视图在服务器端呈现,但document是客户端浏览器提供的对象。您无法从客户端向此服务器端列表动态添加元素。您需要以某种方式对列表进行编码,以便客户端能够读取,例如在JavaScript数组中。然后使用JavaScript .push方法动态修改客户端列表。然后以单独的操作将其发送回控制器。

答案 1 :(得分:2)

这不会那么简单。

首先,您使用的Razor声明

@Model.add(document.getElementById("input_box").value);

不是有效的C#语句。当您尝试打开页面时会导致异常,因为您正在使用的模型类型(List<T>)没有名为add的方法(尽管它有Add),而且因为javascript是无效的Razor代码:)

其次,您似乎对服务器 - 客户端交互的工作方式感到困惑。 您需要仔细考虑如何实现您想要做的事情 -

为了能够从客户端(用户的浏览器)获取信息,首先需要渲染页面,将其发送到客户端,让用户(或其他)输入信息,然后将其转到将其发送回Controller操作。目前您的网页甚至没有渲染,因此您无法希望从任何人那里获取数据。

这仍然可以通过多种方式解决,其中一种方法是使用Html.BeginForm(...)创建一个简单的表单,并在其中的某处有一个输入元素和一个提交按钮。

如果您可以让用户将数据提交给您,则可以使用前面提到的Controller操作中的数据执行任何操作。

答案 2 :(得分:0)

好的,通过在View的JavaScript中创建一个全局数组,然后将它作为Ajax参数传递给Controller函数来解决它。