将值保存在列表和列表中工作正常。
abc= (ABC)(Session["xml"]);
string ctrlStr = String.Empty;
foreach (string ctl in Page.Request.Form)
{
if (ctl.Contains("something"))
{
ctrlStr = ctl.ToString();
abc.student[0].marks[j].science.something.Value = Convert.ToDecimal(Request.Form[ctrlStr]);
}
当我点击相应动态文本框上的编辑按钮时,想要从保存的对象中检索值....
foreach (string ctl in Page.Request.Form)
{
if (ctl.Contains("studentname"))
{
ctrlStr = ctl.ToString();
(Request.Form[ctrlStr]) = abc.student[0].marks[x].science.studentname.ToString();---Gives an error stating the collection is only readonly
}
}
答案 0 :(得分:3)
Request.Form
- 与Request
对象一般 - 是只读的,反映了这样一个事实,即当您响应请求时,请求本身无法更改。 ASP.NET使用POST形式的值在页面上创建服务器控件,这些允许您控制input
和写入Response
对象的其他表单元素的值。 / p>
在您的情况下,TextBox
控件是动态生成的,因此它们不会自动绑定到表单值 - 因此您的问题。您需要在创建控件时保留对控件的引用(或者之后使用FindControl()
方法查找它们)并设置其Text
属性。
(原始答案如下)
Controls集合在页面构造中的某个点处变为只读。你必须在那之前进行操纵。我不记得它是什么时候,但你通过OnPreRender安全地使用OnLoad。
您的代码从何处开始?
更新:好的,我知道你要做的是什么。如果您正在处理服务器端控件(即ASP.NET生成的控件),这将是最简单的。在aspx
(或ascx
)中看起来像这样:
<asp:TextBox runat="server" ID="studentname"/>
然后您可以像这样更新值:
abc = (ABC)(Session["xml"]);
studentname.Text = abc.student[0].marks[j].science.something.Value.ToString();
这将自动设置studentname文本框的值,而无需搜索所有Request.Form项。 (假设你在某处设置了j
...我不知道相关的背景。)
我无法从您的代码中确定,但看起来您可能只是有一个“计划HTML”输入,看起来更像是这样:
<input type="text" name="studentname"/>
在这种情况下,没有简单的方法来更新页面代码中的值,因此我首先要确保您使用的是服务器端控件。
答案 1 :(得分:1)
您可以使用反射设置Request.Form值:
Request.Form.GetType().BaseType.BaseType.GetField("_readOnly", BindingFlags.NonPublic | BindingFlags.Instance)
.SetValue(Request.Form, false);
Request.Form["foo"] = "bar";
答案 2 :(得分:0)
您想要实现的目标?
Form集合使用POST方法检索发布到HTTP请求正文的表单元素的值。 - http://msdn.microsoft.com/en-us/library/ms525985(v=vs.90).aspx