ThinkGeo.com    |     Blog    |     Wiki    |     Support

Map1.ajaxCallAction does not pass custom Model rather than map

I have a lot of data i would like to manage them in my Model. So i created a new class ViewModel that includes Map, and other data elements as class properties.



Everything is working:

Html.ThinkGeo().Map(Model.Map).Render();



Anywhere in client side, i use Model.Map to refer to the Map. 



However, Map1.ajaxCallAction calls my MapActionFilter with an instance of ViewModel that includes all data element null!

If i define the MapActionFilter with the first parameter as Map, everything still works. But i could not get my other data elements in ViewModel.



is there a better way to do this? Without messing up Map.



Thanks,

Hi guangming,



I think this is a good question and I can image that. 

The other data in ViewModel missing is caused we are using the MapActionFilterAttribute, which only handlers the map information and the extra parameters from ajaxCall method. Some codes in MapActionFilterAttribute like this:

            filterContext.ActionParameters[“map”] = mapSession;
            filterContext.ActionParameters[“args”] = objects;
And this maps the action structure like:

         [MapActionFilter]
        public ActionResult ClictEvent(Map map, GeoCollection args)


So, based on this attribution, we can’t get the other models of viewmodel by calling the pre-defined method “ajaxCall”. But as an option, we can define another filter attribution to handler the other models in your viewModel, we can define it like :


[AttributeUsage(AttributeTargets.All, AllowMultiple = true), Serializable]
public class ViewModelActionFilterAttribution : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.ActionParameters[“others”] = “other parameters from viewmodel”;
        base.OnActionExecuting(filterContext);
    }
}

And the action is like:


           [MapActionFilter]
        [ViewModelActionFilterAttribution]
        public ActionResult ClickEvent(Map map, GeoCollection<object> args, string others)
        {…
        }

But the above is just a mocker as I don’t what’s the way you are calling the action, is it by calling the “ajaxCall” or do the post on the form?

So, it is better you can send us your sample which can mock your project.



Thanks,

Troy

This is pretty cool. I like ajaxCall. 
  
 In my case, I have a viewmodel: 
 class ViewModel { 
  
 Map map; 
 MyClass myClass; 
 } 
  
 In the action that creates the map, I return View(myViewModel). 
 At the client side: Html.ThinkGeo().Map(Model.Map).Render(); 
  
 for any ajaxCall, I would like to return the whole viewmodel to make things simple, or the way you suggest: adding a new parameter MyClass. 
  
 I noticed that your example ClieckEvent returns ActionResult; the functions called by ajaxCall return void. Are we talking the same thing? 
  
 For example, one sample from the sample solution: 
         [MapActionFilter] 
         public void MergeFeature(Map map, GeoCollection args) 
         {} 
  
 I am curious: how the MergeFeature function called when the client side Map1.ajaxCall is called? is it a MapSuite feature, a MVC feature, or a Opensource JS feature? 
  
 Thanks,

Hi,


The ajaxCall is extended
by Map Suite based on the Microsoft client ajax library and Asp.net ModelBinder
feature, it’s designed as a shortcut for the users to do an Ajax call easily,
just like the Asp.NET DefaultModelBinder and DefaultActionFilter, the extended MapEntityModelBinder
and MapActionFilterAttribute just supported the .NET simple type and map
object, if you would like to make the action to return a custom model, you need
to create your own ModelBinder inherited from MapEntityModelBinder (here can
inherited from DefaultModelBinder, but will lost map information), and please make
sure implement base method, in the override method , you can abstract your
model from input parameters, here is a quick guide codeproject.com/Articles...del-Binder
, please check it out.


 


For the confusion “I noticed that your
example ClieckEvent returns ActionResult; the functions called by ajaxCall
return void
”, actually, the return value is depended on your
requirements, if you would like the client callback script get some values from
server side, you can return a value, otherwise, it can be void.


 


Hope it helped,


Johnny


 



How can we send our custom View Model to the controller via Map1.ajaxCallAction ?

Hi Jmarshall,

Please refer the reply in post: Shapefile click event

Regards,

Ethan