我的应用程序使用Helper类将自定义属性写入输入控件。而且我们正在动态加载UserControl,因此我们需要使用FormCollection来获取发布的值。 有没有办法可以从FormCollection对象访问属性值。
示例:
<input type="text" name="textBox1" value="harsha" customAttr1 = "MyValue" />
我的问题是如何从上面例如从控制器内部访问customAttr1的值。
先谢谢你的帮助..
答案 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)
{