ASP.NET MVC pass data from a view to master
One of recurring questions in MVC is how to share data between views and master. The question must be reformulated : how to share data between ACTION and master.
The short answer is : Model of the View returned from Action have to put some data to the Model of the Master
The long answer here in 4 steps
Step 1: ensuring error.aspx page works fine
a)copy \Views\Shared\Site.Master into siteerror.master( the error.aspx inherits from a specialized model)
b) change in \Views\Shared\Error.aspx
1 | <%@ Page Language= "C#" MasterPageFile= "~/Views/Shared/Site.Master" Inherits= "System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> |
to
1 | <%@ Page Language= "C#" MasterPageFile= "~/Views/Shared/SiteError.Master" Inherits= "System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> |
Step 2 : make the master strongly typed :
add a ModelMaster class
1 2 3 4 5 6 7 8 | public class ModelMaster { public ModelMaster() { DataFromAction = "default data" ; } public string DataFromAction { get ; set ; } } |
and display this data to the html of \Views\Shared\Site.Master
1 2 3 4 5 | <%@ Master Language= "C#" Inherits= "System.Web.Mvc.ViewMasterPage<MasterDataFromAction.Models.ModelMaster>" %> //code <h1>This is data shared from View : <%= Model.DataFromAction%></h1> |
Step 3. Make the action return a strongly typed view. We will make , for example, the Index action from Home controller.
Add the ViewModelIndex class
1 2 3 4 5 6 7 8 | public class ViewModelIndex :ModelMaster { public ViewModelIndex() : base () { base .DataFromAction = "data from index" ; } } |
and modify controller action and view
First Index action in \Controllers\HomeController.cs
1 2 3 4 5 6 7 | public ActionResult Index() { ViewData[ "Message" ] = "Welcome to ASP.NET MVC!" ; ViewModelIndex vmi = new ViewModelIndex(); vmi.DataFromAction = "here comes data from index action" ; return View(vmi); } |
Then the view :
1 | <%@ Page Language= "C#" MasterPageFile= "~/Views/Shared/Site.Master" Inherits= "System.Web.Mvc.ViewPage<MasterDataFromAction.Models.ViewModelIndex>" %> |
The result is here :
When do you do this things? The sooner, the better
Please find attached the project