在asp.net mvc 3中使用ViewModel

时间:2012-01-22 21:22:49

标签: asp.net-mvc asp.net-mvc-3 session viewmodel multiple-forms

这是我的场景:(这些都必须在与可接受的要求相同的视图中完成)

  1. 用户输入一些搜索标准来搜索用户。
  2. 页面列出了搜索结果,其中包含更新链接。
  3. 用户点击其中一个更新链接,系统会显示一个表单以启用编辑数据。
  4. 用户更改并保存绑定到表单的数据。
  5. 我为这个视图使用了一个视图模型。在这里。

    [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中。但我认为这还不够好。如果会话过期或如果我必须使用负载均衡器部署我的应用程序怎么办?

    开发此类页面的最佳方法是什么?我愿意接受任何建议。

    提前致谢,

0 个答案:

没有答案