从Asp.net MVC中的FormCollection中获取属性值

时间:2011-01-27 13:41:48

标签: asp.net-mvc formcollection

我的应用程序使用Helper类将自定义属性写入输入控件。而且我们正在动态加载UserControl,因此我们需要使用FormCollection来获取发布的值。 有没有办法可以从FormCollection对象访问属性值。

示例:

<input type="text" name="textBox1" value="harsha" customAttr1 = "MyValue" />

我的问题是如何从上面例如从控制器内部访问customAttr1的值。

先谢谢你的帮助..

3 个答案:

答案 0 :(得分:0)

你的助手是如何构建的?如果它正在扩展HtmlHelper,则可以访问ViewContext.HttpContext.Request.Form,它是一个NameValueCollection;模型绑定器使用FormCollection将值发布回操作方法。它没有在其他地方公开曝光。

HTH。

答案 1 :(得分:0)

简单的答案不用担心,formCollection只包含基本的Key和Value信息。

一旦进入控制器,可能更容易重新水化该信息?使用某种机制来识别你传入的内容。

另一种方法是,如果您有一个映射到基本类型的控件列表,那么您可以遍历每个控件。

MVC有点神奇,可以将属性映射回模型,甚至映射到列表。

如果您的模型包含控件列表:

public class Control
{
    String Value {get; set;}
    String Attribute1 {get; set;}
}

public class ControlViewModel
{
    IList<Control> Controls {get; set;}
}

然后在你看来:

for(var i = 0; i<controls.Count;i++)
{
   // Obviously this isnt complete right i needs to increment from 0; would be build using your htmlhelpers.
    <input id="Controls[i]_Value" name="Controls[i].Value" type="text" value="hello" />
    <input id="Controls[i]_Attribute1" name="Controls[i].Attribute1" type="hidden" value="Attribute" />
}

在您的httppost操作中,您可以收集ControlViewModel并填充Controls列表。

我没有测试过这个,可能有很多错误,但这应该足以开始了;在那里发帖讨论这个,如果我发现任何发布后我会添加它们。

答案 2 :(得分:0)

正如Luke已经说过的那样.. Form Collection是字典对象,只保存名称,值对..为了将该东西放入控制器,您需要通过ajax传递该自定义属性。

var form = $("#formid").serialize(),
    custom = $("input:text").attr("customAttr1").val();
$.ajax({ 
    type: "POST", 
    url: "/controller/ProcessData", 
    data:{collection :form,customAttr: custom },
    dataType: "html", 
    traditional: true
});

在控制器中,您需要具有以下语法:

public ActionResult ProcessData(FormCollection collection ,string customAttr)
{

如果您需要传递多个自定义值,您需要从ajax请求发布字符串数组并使控制器签名如下:

public ActionResult ProcessData(FormCollection collection ,string[] customArray)
    {