Mobile MVC framework (part 2)


Last time I showed you how to create a simple Login Form and pass the data between the View and Controller using ViewData dictionary. In this post I am going to show you how to pass a strongly typed data.


We will continue working with code sample we created last time. We are going to add a new form to the project that will display a list of items in the ListBox as well as to allow filtering the data in this ListBox by entering the filtering criteria in the TextBox. Let's add the new form to the project with the name SearchForm wich should look like that:



 


The Model 


Let's add the Products class to the project which is goind to contain the List of products and implement a few simple methods to populate the list as well as a method to filter the list by the certain criteria:


    /// <summary>


    /// Model class


    /// </summary>


    public class Products


    {


        private List<string> productList;


     


        public List<string> ProductList


        {


            get


            {


                return productList;


            }


            set


            {


                productList = value;


            }


        }


 


        public string ProductType { get; set; }


 


        public void PopulateList()


        {


            productList = new List<string>();


            productList.Add("Chicken");


            productList.Add("Bread");


            productList.Add("Tomato");


            productList.Add("Cucumbers");


            productList.Add("Butter");


            productList.Add("Cheese");


 


            ProductType = "Food";


        }


 


        public void FilterData(string filter)


        {


            if (filter != "")


            {


                IEnumerable<string> result = productList.Where<string>(s =>                                                                        s.ToString() == filter);


                this.productList = result.ToList<string>();


            }


            else


            {


                PopulateList();               


            }          


        }


    }


The next let's modify the SearchForm code file to inherit from ViewForm and implement the IView<TModel> interface. Initially I have implemented the ViewForm<TModel> class and thought that I would be able to inherit from it, but I hit the old bug in the Visual Studio form's designer that doesn't like the generics if you want to visual inheritance, so I had to resort to a few workarounds such as implement the IView<TModel> interface by the form:


    public partial class SearchForm : ViewForm, IView<Products>


    {


        public SearchForm()


        {


            InitializeComponent();


        }


 


        #region IView<Products> Members


 


        public new ViewDataDictionary<Products> ViewData


        {


            get;


            set;


        }


 


        #endregion


 


    }


Let's add the override for OnUpdateView to the form that will be called from the controller:


protected override void OnUpdateView(string key)


{


     if (key == "Category")


     {


          this.lblProductType.Text = this.ViewData.Model.ProductType;


     }


     if (key == "Products")


     {


          // Bind the product list to the listbox


          this.lstProducts.DataSource = this.ViewData.Model.ProductList;


     }


}


and add the implementation for button event handler:


private void cmdSearch_Click(object sender, EventArgs e)


{


     // Place the filter data into the ViewData


     this.ViewData["Filter"] = txtSearch.Text;


     // Notify the controller


     this.OnViewStateChanged("Search");


}


Search Controller


When creating the SearchController we will derive it from the Controller<TModel> and make an appropriate calls to the Products class:


public class SearchController : Controller<Products>


{


     public SearchController(IView<Products> view) : base(view)


     {


         // Create an intance of the Products


         Products products = new Products();


         // Populate the list


         products.PopulateList();


         // Assign the Model


         this.view.ViewData.Model = products;


         // Notify the view of the changes


         this.view.UpdateView("Products");


     }


 


     protected override void OnViewStateChanged(string key)


     {


         switch (key)


         {


             case "Search":


                  string filter = this.view.ViewData["Filter"].ToString();     


                  this.view.ViewData.Model.FilterData(filter);


                  // Notify the view of the updates


                  this.view.UpdateView("Products");


                  break;


            }


         }


      }


}


Download the project from here.

MVCDemoClient.zip

Comments (8)

  1. robtiffany says:

    Your Mobile MVC framework looks great Alex!

    -Rob

  2. AlexYak says:

    Thanks, Rob 🙂

    -Alex

  3. Kevin Daly says:

    Excellent!

    When I read Part 1 I was wondering about support for strongly typed data, this is looking very cool.

    When I get some brain cycles free from looking for a job (don’t get me started on the unemployment thing) I’ll look at re-engineering my mobile blogging client (Diarist) to make use of it.

    I think Microsoft owes you a debt of thanks Alex for your many contributions to getting those of us who have been becoming disillisioned with the Compact Framework to stick with it.

  4. Fergara says:

    Very nice Alex. Beautiful code.

  5. Just for people who are not comfortable with passing strings when notifiying the view or the controller,

  6. Fergara says:

    I see people asking "Who is the responsible for the controller instantiation?" I understand that there are no responsible for newing the controller in MVC. In the code Alex instantiates the SearchController from the Login controller, and that´s fine, the controller gets the control! Anyone here see imagine a example where we can only make that from the View?

  7. fox23 says:

    AlexYakhnin在他的blog上发布了一系列关于WindowsMobileMVCFramework的文章.

  8. Nestas coisas das teorias sobre a melhor forma de separar as diferentes camadas de uma aplicação, há

Skip to main content