0

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

例子:

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

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

我在这里先向您的帮助表示感谢..

4

3 回答 3

0

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

HTH。

于 2011-01-27T13:50:54.353 回答
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应该填充列表。

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

于 2011-01-27T14:02:41.873 回答
0

正如卢克已经告诉.. 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)
    {
于 2011-03-31T18:58:29.167 回答