Using ViewModels in asp.net mvc 3

349 views Asked by At

Here is my scenario: (These all have to accomplished in the same view as an accepted requirement)

  1. User enters a few search criterias to search users.
  2. Page lists the search results with an update link besides.
  3. User clicks on one of the update links and a form appears to enable editing the data.
  4. User does changes and saves the data that binded to form.

I used a view model for this view. Here it is.

[Serializable]
public class UserAddModel
{
    public UserSearchCriteria UserSearchCriteria { get; set; }

    public UserEntity User { get; set; }

    public List<UserPrincipalDto> SearchResults { get; set; }
}

And here is my controller:

using System;


namespace x.Web.BackOffice.Controllers
{
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
[Authorize(Roles = "Admin")]
public class UserController : Controller
{
    private readonly IAuthentication _authentication;

    private readonly List<RoleEntity> roles = new Y.Framework.Data.Repository<RoleEntity>().Get(null).ToList();
    private Repository<UserEntity> repository = new Repository<UserEntity>();

    [ImportingConstructor]
    public UserController(IAuthentication authentication)
    {
        this._authentication = authentication;
    }

    public ActionResult Index()
    {
        return View(new UserAddModel());
    }

    [HttpPost]
    public ActionResult GetSearchResults(UserAddModel model)
    {
        if (ModelState.IsValid)
        {
            try
            {
                List<UserPrincipalDto> results = 
                    _authentication.SearchUsers(
                        ConfigurationManager.AppSettings["DomainName"],
                        model.UserSearchCriteria.FirstName,
                        model.UserSearchCriteria.LastName,
                        model.UserSearchCriteria.Username);

                model.SearchResults = results;

                Session["UserAddModel"] = model;

                return View("Index", model);
            }
            catch (Exception ex)
            {
                Logger.Log(ex, User.Identity.Name);
            }
        }
        else
        {
            ModelState.AddModelError("", "Error!");
        }

        Session["UserAddModel"] = model;

        return View("Index", model);
    }

    public ActionResult Save(string username)
    {
        UserAddModel model = Session["UserAddModel"] as UserAddModel;

        UserEntity exists = repository.Get(u => u.Username == username).FirstOrDefault();

        if (exists == null) 
        {
            UserPrincipal userPrincipal =
            _authentication.GetUserDetails(
                ConfigurationManager.AppSettings["DomainName"],
                username);

            model.User = new UserEntity();
            model.User.Id = userPrincipal.Guid.Value;
            model.User.FirstName = userPrincipal.DisplayName.FullNameToFirstName();
            model.User.LastName = userPrincipal.DisplayName.FullNameToLastName();
            model.User.Email = userPrincipal.EmailAddress;
            model.User.Username = userPrincipal.SamAccountName;    
        }
        else
        {
            model.User = new UserEntity();
            model.User.Id = exists.Id;
            model.User.FirstName = exists.FirstName;
            model.User.LastName = exists.LastName;
            model.User.Email = exists.Email;
            model.User.Username = exists.Username;
            model.User.RoleId = exists.RoleId;
        }

        ViewBag.Roles = roles;

        return View("Index", model);
    }

    [HttpPost]
    public ActionResult Save(UserAddModel model)
    {
        UserEntity exists = repository.Get(u => u.Id == model.User.Id).FirstOrDefault();

        if (exists == null) 
        {
            Result result = repository.Save(model.User);    

            HandleResult(result, model);
        }
        else 
        {
            Result result = repository.Save(model.User, PageMode.Edit);

            HandleResult(result, model);
        }

        ViewBag.Roles = roles;

        return View("Index", model);
    }
}
}

As you see there are two different forms in my view and I'm storing the whole view model in Session in my controller. But I think this is not fine enough. What if session expires or what if I have to deploy my application using a load balancer?

What is the best way to develop this kind of page? I'm open to any kind of suggestions.

Thanks in advance,

0

There are 0 answers