DZone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
Refcards Trend Reports Events Over 2 million developers have joined DZone. Join Today! Thanks for visiting DZone today,
Edit Profile Manage Email Subscriptions Moderation Admin Console How to Post to DZone Article Submission Guidelines
View Profile
Sign Out
Refcards
Trend Reports
Events
Zones
Culture and Methodologies Agile Career Development Methodologies Team Management
Data Engineering AI/ML Big Data Data Databases IoT
Software Design and Architecture Cloud Architecture Containers Integration Microservices Performance Security
Coding Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Partner Zones AWS Cloud
by AWS Developer Relations
Culture and Methodologies
Agile Career Development Methodologies Team Management
Data Engineering
AI/ML Big Data Data Databases IoT
Software Design and Architecture
Cloud Architecture Containers Integration Microservices Performance Security
Coding
Frameworks Java JavaScript Languages Tools
Testing, Deployment, and Maintenance
Deployment DevOps and CI/CD Maintenance Monitoring and Observability Testing, Tools, and Frameworks
Partner Zones
AWS Cloud
by AWS Developer Relations
The Latest "Software Integration: The Intersection of APIs, Microservices, and Cloud-Based Systems" Trend Report
Get the report

Google Maps in MVC 4 with Custom InfoWindow

Ever wonder how to customize the info that pops up about a location in Google Maps? We'll show you how to do just that using MVC4.

Allen ONeill user avatar by
Allen ONeill
·
Apr. 28, 17 · Tutorial
Like (1)
Save
Tweet
Share
13.60K Views

Join the DZone community and get the full member experience.

Join For Free

Introduction

I was recently investigating using Google Maps in a web-application and couldn't find a clear example that showed how to do it with MVC 4. Hopefully, this article fills that gap! Technologies used include MS C#, MVC 4, jQuery, and of course the Google Maps API.

Background

There were some "gotchas" I encountered while putting this together. The first is that (at least for me), using a jQuery selector to link my div that would contain the Google map didn't work. I had to specifically use the JavaScript document.getelementById call. The second was sizing. Using the default size (which was teeny weenie) wasn't cutting it for me, so I increased width/height. Turns out Google Maps didn't like that too much. After a bit of digging I found a post that said to create a quick in-page style that set the max-width to "none"; then it worked.

Using the Code

Create a new MVC 4 project - this will include, by default, appropriate links to jQuery and other supporting files you will need to run this tutorial.

All of the work we are doing is in the "Index view" - so go to that file and clean out any HTML, etc., you don't need.

Add in a script ref to the Google Maps API at the top of the file:

<script src="http://maps.google.com/maps/api/js?sensor=true" type="text/javascript">
</script> 

Somewhere near that (or in an external stylesheet if you wish), add in this tweak to ensure the map and its controls size correctly:

<style> #map_canvas img{max-width:none} </style>

Here is another piece of CSS I put in - it is to style the popup infoWindow (optional) when someone clicks on a map marker.

<style>
    .infoDiv {
    height: 200px;    
    width: 300px; 
    -webkit-user-select: none; 
    background-color: white; 
}  </style>

Before we drop in the script code itself, we need to create a razor "SECTION" to surround the code. The reason for this is to let MVC manage the placement of the script within the output HTML file. This is important to ensure that things are loaded in the correct order.

If you look in the view folder, you will see a folder called "Shared" - in here is "_Layout.cshtml". This is the parent wrapper for the main Index view page. At the bottom, you will notice these two lines:

@Scripts.Render("~/bundles/jquery") 
@RenderSection("scripts", required: false)  


This tells the razor engine "render/load all the jQuery files, then once that is done, output any section marked as "scripts."

Let's go back to our view index page and add a section wrapper:

@section scripts { 
<section class="scripts">  
   <script type="text/javascript">
// our code will go in here...
   </script>


Now the code that makes the magic happen:

<!-- This code tells the browser to execute the "Initialize" method 
         only when the complete document model has been loaded. -->
$(document).ready(function () {
    Initialize(); 
});  


Most will already know that the above is jQuery code that tells the browser only to execute the method Initialize once the entire document model has been loaded. This ensures JavaScript does not try to trigger or access an object that has not yet been created.

initialize is the main method that does all of the work:

function Initialize() {


Google has tweaked their interface somewhat - this tells the API to use that new UI.

google.maps.visualRefresh = true;
var Liverpool = new google.maps.LatLng(53.408841, -2.981397);


These are options that set the initial zoom level, where the map is centered globally to start, and the type of map to show:

var mapOptions = {
    zoom: 14,
    center: Liverpool,
    mapTypeId: google.maps.MapTypeId.G_NORMAL_MAP
};


This makes the div with id map_canvas a Google map:

var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);


This shows adding a simple pin "marker" - this happens to be the Tate Gallery in Liverpool!

var myLatlng = new google.maps.LatLng(53.40091, -2.994464);
var marker = new google.maps.Marker({
    position: myLatlng,
    map: map,
    title: 'Tate Gallery'
});


You can make markers different colors. Google it up!

marker.setIcon('http://maps.google.com/mapfiles/ms/icons/green-dot.png')


A sample list of JSON encoded data of places to visit in Liverpool, UK. You can either make up a JSON list on the server-side or call it from a controller using JSONResult.

var data = [
  { "Id": 1, "PlaceName": "Liverpool Museum", 
    "OpeningHours":"9-5, M-F","GeoLong": "53.410146", 
    "GeoLat": "-2.979919" },
  { "Id": 2, "PlaceName": "Merseyside Maritime Museum ", 
    "OpeningHours": "9-1,2-5, M-F", "GeoLong": 
    "53.401217", "GeoLat": "-2.993052" },
  { "Id": 3, "PlaceName": "Walker Art Gallery", 
    "OpeningHours": "9-7, M-F", "GeoLong": 
    "53.409839", "GeoLat": "-2.979447" },
  { "Id": 4, "PlaceName": "National Conservation Centre", 
    "OpeningHours": "10-6, M-F", "GeoLong": 
    "53.407511", "GeoLat": "-2.984683" }
];


Using the jQuery each selector, iterate through the JSON list and drop marker pins.

$.each(data, function (i, item) {
            var marker = new google.maps.Marker({
    'position': new google.maps.LatLng(item.GeoLong, item.GeoLat),
    'map': map,
    'title': item.PlaceName
});

Make the marker pin blue!

marker.setIcon('http://maps.google.com/mapfiles/ms/icons/blue-dot.png')


Put in some information about each JSON object (in this case, the opening hours):

var infowindow = new google.maps.InfoWindow({
    content: "<div class='infoDiv'><h2>" + 
      item.PlaceName + "</h2>" + "<div><h4>Opening hours: " + 
      item.OpeningHours + "</h4></div></div>"
});


Finally, hook up an OnClick listener to the map so it pops up an info window when the marker pin is clicked!

google.maps.event.addListener(marker, 'click', function () {
            infowindow.open(map, marker);
        });
    })
}


And that's all there is to it! F9 to run, nothing more to see here, move along, opening hours on the map.

 Image title

Google Maps Google (verb)

Published at DZone with permission of Allen ONeill. See the original article here.

Opinions expressed by DZone contributors are their own.

Popular on DZone

  • Top 10 Best Practices for Web Application Testing
  • 4 Best dApp Frameworks for First-Time Ethereum Developers
  • How To Set Up and Run Cypress Test Cases in CI/CD TeamCity
  • Browser Engines: The Crux of Cross-Browser Compatibility

Comments

Partner Resources

X

ABOUT US

  • About DZone
  • Send feedback
  • Careers
  • Sitemap

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • Become a Contributor
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 600 Park Offices Drive
  • Suite 300
  • Durham, NC 27709
  • support@dzone.com
  • +1 (919) 678-0300

Let's be friends: