Using ajax with surface controllers? (along with general surface controller questions)

Hi guys,

At the moment I'm trying to do something similar to Sebastiaan with his tutorial: http://cultiv.nl/blog/2011/11/15/creating-an-umbraco-5-package/

The only difference is I'm trying to use ajax to post back my form data using the following:

...
$.ajax({
  url: '/ContactSurface/SubmitForm',
  type: "POST",
  data: JSON.stringify(contactVM),
  contentType: "application/json; charset=utf-8",
  success: function (result) {
    $('#result').empty();
    $('#result').html(result);
  },
  error: function () {
    $('#result').empty();
    $('#result').html("<p>There was a problem submitting your message. Please try again.</p>");
  }
});
...

Within my surface controller I then have the following function:

[HttpPost]
public PartialViewResult SubmitForm(ContactViewModel contactVM)
{
  if (!ModelState.IsValid)
  {
    return PartialView("GetForm", contactVM);
  }

var contact = new Contact
{
Name = contactVM.Name,
Email = contactVM.Email,
Message = contactVM.Message
};

// Do whatever with new contact class

return PartialView(“Thankyou”);
}

Now before I tried to add this as a surface controller in umbraco, I did a standalone MVC3 project to test all the code and make sure it worked but now I'm trying to add it as a plugin, things aren't working.

Before I proceed I'll mention that I'm still not entirely sure how the whole surface controller thing works with Umbraco. I've read Shannon's tutorial regarding surface controllers and while I understand how they work, I don't understand how it ties in with the CMS.

From what I can see, it looks as though I have to add each function in my surface controller as a macro? In this test surface controller I've written I have two functions: one called GetForm() which returns a default view and the above SubmitForm() which is supposed to handle the posted form data. The code for the former is below:

[ChildActionOnly]
public PartialViewResult GetForm()
{
  return PartialView("GetForm", new ContactViewModel());
}

What I've then done is to add my 'GetForm' and 'Thankyou' partial views to the Settings/Partials folder. I've then called the macro using: @Umbraco.RenderMacro("getForm") on my template.

This /seems/ to have worked as the page is successfully calling my GetForm function and returning the view specified. However when I fill in this form and post it back, nothing happens. I think I'm posting back to the correct page using /ContactSurface/SubmitForm in the 'post' field of my first code segment but I'm not sure.

I'm also unsure as to whether I have to register this function as a macro like I did with the GetForm() function. I realised I couldn't get the SubmitForm function to show in the macro dropdown unless I gave it the [ChildAction] attribute so I'm not really sure what I have to do here? What's the difference between a 'ChildAction' macro type and a 'Partial View' macro type?

One final question, what are macro partials? I can't seem to find any documentation on them and have no idea how they fit in with everything. On top of this there's a 'Partials' folder in the settings tab but I'm guessing this is just for standard partial views?

I realise this is a big post and appreciate any help that people can offer! I'm having a hard time understanding all these new terms :-)

Thanks.


This is a companion discussion topic for the original entry at https://our.umbraco.com/forum/29553-using-ajax-with-surface-controllers-along-with-general-surface-controller-questions