Comboboxes in MVC from model driven ViewModel

This article was moved to MDriven Wiki Comboboxes in MVC from model driven ViewModel

To get everything to work as in the article you need the latest build (written 131108)

Combobox, picklist or dropdown list – many names for the same thing.

The combobox is perfect when setting references between objects – if the number of items to pick from is not too large.

When creating the viewmodel go like this (Look at the 2 last lines in the Green ViewModelClass and at the blue):

 

image

This is automated for you if you want by right clicking:

image

Modlr knows that “Example1” is a perfect candidate for a Combobox since it is a single link.

You get this:

image

Modlr suggests Example1.allinstances to be the pick list, but you are free to change it. Maybe you want to add a “->orderby(e|e.attribute1)” there.

To get the whole MVC roundtrip to work – we need to add an identity column to the PickListPresentation class.

image

I make sure CodeGen is checked and then generate code:

image

Looking at the generated code for the ViewModel VMExample2 we see this new thing:

image

Notice that modlr  did not only add code for Example1, it also added code for Example1_AsExternalId… And this is important for MVC.

In the View I enter this:

    <div class="display-field">
      @Html.DropDownListFor(x => x.Example1_AsExternalId, 
        new SelectList(Model.Example1_PickList , //The list
                       "Identity",               // What attribute to pick
                       "Presentation",           // what to present
                       Model.Example1_AsExternalId)) // what to set on pick
    </div>
    <div class="display-field">
            @Html.EditorFor(model => model.OwnedBy)    // Added this just for info   
    </div>

And I get this:

image

Then I change in the combo and press save:

image

The save method needs to do nothing special to make this happen:

 

        [HttpPost]
        public ActionResult Details(string Identity, VMExample2 offlinevm)
        {
          Example2 e2 = EcoSpace.ExternalIds.ObjectForId(Identity).AsObject as Example2;
          try
          {
            VMExample2 onlinevm=VMExample2.Create(EcoSpace, e2);
            ViewModelHelper.ApplyValues(offlinevm, onlinevm, null);
            Commit();
            return View("Details", onlinevm);
          }
          catch
          {
            return View("Details", offlinevm);
          }
        }
This entry was posted in MVC, ViewModel. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.