Posted By: Anonymous
I am pretty sure I am doing something wrong here. Over the last 2 months we have been developing a web app using MVC and Razor and we never thought of using the form element. Now so much has already been done with master pages and sub pages that it means restructuring most of our code in order to use form element and the would result in multiple form elements on a page.
That aside, in Asp.Net if I wanted to access any control in the C# code behind I could just give it an ID=”SomeID” and a RUNAT=”SERVER”. Then in my code behind I could set its value and properties.
When I do this in Razor, we use lines like:
<input id="hiddenPostBack" runat="server" type="hidden" />
Why can’t I access this in the controller? I want to detect a postback and set the value to false if it is the first time the page loads, and if not, then set the value to true. Then based on this, I will read it either server side or client side and do something.
My real question is, how do I “do something” both server side and client side given that I don’t have a form element. I was under the impression that if I wanted to pass values from client to server and back, the easiest way to do this is with a hidden input. But I am just not getting how to accomplish this with MVC3 and razor.
Thanks in advance for your help.
A move from WebForms to MVC requires a complete sea-change in logic and brain processes. You’re no longer interacting with the ‘form’ both server-side and client-side (and in fact even with WebForms you weren’t interacting client-side). You’ve probably just mixed up a bit of thinking there, in that with WebForms and
RUNAT="SERVER" you were merely interacting with the building of the Web page.
MVC is somewhat similar in that you have server-side code in constructing the model (the data you need to build what your user will see), but once you have built the HTML you need to appreciate that the link between the server and the user no longer exists. They have a page of HTML, that’s it.
So the HTML you are building is read-only. You pass the model through to the Razor page, which will build HTML appropriate to that model.
If you want to have a hidden element which sets true or false depending on whether this is the first view or not you need a bool in your model, and set it to True in the Action if it’s in response to a follow up. This could be done by having different actions depending on whether the request is [HttpGet] or [HttpPost] (if that’s appropriate for how you set up your form: a GET request for the first visit and a POST request if submitting a form).
Alternatively the model could be set to True when it’s created (which will be the first time you visit the page), but after you check the value as being True or False (since a bool defaults to False when it’s instantiated). Then using:
@Html.HiddenFor(x => x.HiddenPostBack)
in your form, which will put a hidden True. When the form is posted back to your server the model will now have that value set to True.
It’s hard to give much more advice than that as your question isn’t specific as to why you want to do this. It’s perhaps vital that you read a good book on moving to MVC from WebForms, such as Steve Sanderson’s Pro ASP.NET MVC.