Использование ViewModels в asp.net MVC 3 - PullRequest
1 голос
/ 23 января 2012

Вот мой сценарий: (Все они должны быть выполнены в том же виде, что и принятое требование)

  1. Пользователь вводит несколько критериев поиска для поиска пользователей.
  2. Страница содержит список результатов поиска со ссылкой на обновление.
  3. Пользователь нажимает на одну из ссылок обновления, и появляется форма, позволяющая редактировать данные.
  4. Пользователь вносит измененияи сохраняет данные, которые связаны для формирования.

Я использовал модель представления для этого представления.Вот оно.

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

    public UserEntity User { get; set; }

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

А вот мой контроллер:

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);
    }
}
}

Как вы видите, в моем представлении есть две разные формы, и я сохраняю всю модель представления в Sessionв моем контроллере.Но я думаю, что это не достаточно хорошо.Что делать, если сеанс истекает или что, если мне нужно развернуть приложение с помощью балансировщика нагрузки?

Как лучше всего разработать такую ​​страницу?Я открыт для любых предложений.

Заранее спасибо,

...