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 *

*