开发者

Request.Form "Collection is only readonly" when trying to set text box content

Saving the values in the Lists & works fine.

 abc= (ABC)(Session["xml"]);

        str开发者_Go百科ing 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]);
            }

Want to retrieve the values from the saved object when I click on edit button back on the respective dynamic textboxes....

 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
            }
        }


Request.Form — like the Request object generally — is read-only, reflecting the fact that, by the time you are responding to a request, the request itself cannot be changed. ASP.NET uses the values from the form POST to create server controls on the Page, and these allow you to control the values of the input and other form elements that are written to the Response object.

In your case, the TextBox controls are being generated dynamically, so they are not automatically bound to form values — hence your problem. You will need to keep references to the controls when they are created (or find them afterwards using the FindControl() method) and set their Text property.

(original answer follows)

The Controls collection becomes read-only at a certain point in the construction of the page. You have to do manipulation before that point. I don't remember offhand when it is, but you're safe with OnLoad through OnPreRender.

Where is your code firing from?

Update: Okay, I see what you're trying to do. This will be easiest if you're dealing with server-side controls (that is, controls generated by ASP.NET. That would look like this in your aspx (or ascx):

<asp:TextBox runat="server" ID="studentname"/>

Then you could update the value like this:

abc = (ABC)(Session["xml"]);  
studentname.Text = abc.student[0].marks[j].science.something.Value.ToString(); 

That will set the value of the studentname text box automatically without needing to search through all of the Request.Form items. (Assuming you set j somewhere... I don't know the context for that.)

I can't tell for sure from your code, but it looks like you may just have a "plan HTML" input, which would look more like this:

<input type="text" name="studentname"/>

In that case, there is no simple way to update the value from your page's code, so I'd start by making sure that you're using server-side controls.


You can set the Request.Form values with reflection:

Request.Form.GetType().BaseType.BaseType.GetField("_readOnly", BindingFlags.NonPublic | BindingFlags.Instance)
    .SetValue(Request.Form, false);
Request.Form["foo"] = "bar";


What you are trying to achieve?

The Form collection retrieves the values of form elements posted to the HTTP request body, with a form using the POST method. - http://msdn.microsoft.com/en-us/library/ms525985(v=vs.90).aspx

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜