views:

27

answers:

1

I've integrated Asp.net MVC with Sharepoint site. It works great. But I'm using default Sharepoint master page as well (~masterurl/default.master namely). the problem is that this particular master page has the whole page wrapped in a form element while all Sharepoint pages are just normal Asp.net WebForm pages.

My MVC content should have it's own form and input elements that I'd like to submit to the server. Ajax calls are obviously not that problematic. I'm not able to use $("form").serializeArray() if I keep the original form element. But nonetheless normal postbacks are problematic, since there's WebForm functionality on submit events and they would send way too much data to server.

I will be using normal postbacks as well as Ajax postbacks. The main problem being normal postbacks.

So I have two possibilities that both should run on $(document).ready():

  1. Delete form element and keep all other content as is. In jQuery it would probably mean to prepend form element with a div, move its content to this div and then delete form.
  2. Directly change form element to div. This would probably be faster in terms of browser processing, but I don't know how to do it.

So if anyone can elaborate a solution for 2. and provide some input on these two possible solutions: which one should be done and why.

Edit

There's a third possibility as well. I could just create my input elements as neede but containe them inside a div element. When user would want to submit my form (div is not a form anyway) I could:

  1. dynamically call $("div.form").serializeArray()
  2. create a form element
  3. populate it with serialized values
  4. append form to body
  5. submit it.

Seems tedious but it could work. Still first two solutions seem simpler.

+1  A: 

If you're submitting via $.ajax() I'd just go with .serialize() of the elements directly, like this:

$.ajax({
  url: "Path/Action",
  type: "post",
  data: $("#someContainer :input").serialize(),
  success: function(data) {
    //do something
  }
});

Or the shorter $.post() version:

$.post("Path/Action", $("#someContainer :input").serialize(), function(data) {
  //do something
});

This doesn't require any <form> generation or other trickery, just a normal jQuery AJAX post (or GET, whatever's needed).

Nick Craver
This is the way to do Ajax postbacks. The main problem here are of course regular postbacks. **And there's another problem here:** What if there's a regular postback to some Sharepoint functionality (since it's present on my page because of the masterpage)? Will my added input elements mess up Sharepoint inner process?
Robert Koritnik
@Robert - Nope, as long as the names are unique...it just won't care about them.
Nick Craver
@Nick: So what about regular postbacks?
Robert Koritnik
@Robert - I would go back to why you need both...what are the situations in which you'd want a regular postback instead of an ajax one? If redirecting is your only motivation you could do that in the callback, might be simpler overall. Honestly wedging something into SharePoint isn't going to be 100% clean anyway...all we can do is get it as clean as possible.
Nick Craver