Asp.net mvc 在asp.net mvc 3中使用ViewModels

Asp.net mvc 在asp.net mvc 3中使用ViewModels,asp.net-mvc,asp.net-mvc-3,session,viewmodel,multiple-forms,Asp.net Mvc,Asp.net Mvc 3,Session,Viewmodel,Multiple Forms,以下是我的场景:(所有这些都必须在与公认需求相同的视图中完成) 用户输入一些搜索标准来搜索用户 页面列出了带有更新链接的搜索结果 用户单击其中一个更新链接,将显示一个表单以允许编辑数据 用户更改并保存绑定到表单的数据 我为此视图使用了视图模型。给你 [Serializable] public class UserAddModel { public UserSearchCriteria UserSearchCriteria { get; set; } public UserEnt

以下是我的场景:(所有这些都必须在与公认需求相同的视图中完成)

  • 用户输入一些搜索标准来搜索用户
  • 页面列出了带有更新链接的搜索结果
  • 用户单击其中一个更新链接,将显示一个表单以允许编辑数据
  • 用户更改并保存绑定到表单的数据 我为此视图使用了视图模型。给你

    [Serializable]
    public class UserAddModel
    {
        public UserSearchCriteria UserSearchCriteria { get; set; }
    
        public UserEntity User { get; set; }
    
        public List<UserPrincipalDto> SearchResults { get; set; }
    }
    
    [可序列化]
    公共类UserAddModel
    {
    公共UserSearchCriteria UserSearchCriteria{get;set;}
    公共用户实体用户{get;set;}
    公共列表搜索结果{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);
        }
    }
    }
    
    使用系统;
    命名空间x.Web.BackOffice.Controllers
    {
    [出口]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    [授权(Roles=“Admin”)]
    公共类UserController:Controller
    {
    私有只读IAAuthentication\u身份验证;
    私有只读列表角色=new Y.Framework.Data.Repository().Get(null.ToList();
    私有存储库=新存储库();
    [导入构造函数]
    公共用户控制器(IAAuthentication身份验证)
    {
    这是。_身份验证=身份验证;
    }
    公共行动结果索引()
    {
    返回视图(新的UserAddModel());
    }
    [HttpPost]
    public ActionResult GetSearchResults(UserAddModel模型)
    {
    if(ModelState.IsValid)
    {
    尝试
    {
    列表结果=
    _身份验证.SearchUsers(
    ConfigurationManager.AppSettings[“域名”],
    model.UserSearchCriteria.FirstName,
    model.UserSearchCriteria.LastName,
    model.UserSearchCriteria.Username);
    model.SearchResults=结果;
    会话[“UserAddModel”]=模型;
    返回视图(“索引”,模型);
    }
    捕获(例外情况除外)
    {
    Logger.Log(例如,User.Identity.Name);
    }
    }
    其他的
    {
    AddModelError(“,”Error!”);
    }
    会话[“UserAddModel”]=模型;
    返回视图(“索引”,模型);
    }
    公共操作结果保存(字符串用户名)
    {
    UserAddModel model=会话[“UserAddModel”]作为UserAddModel;
    UserEntity exists=repository.Get(u=>u.Username==Username).FirstOrDefault();
    if(exists==null)
    {
    用户主体用户主体=
    _authentication.GetUserDetails(
    ConfigurationManager.AppSettings[“域名”],
    用户名);
    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;
    }
    其他的
    {
    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=角色;
    返回视图(“索引”,模型);
    }
    [HttpPost]
    公共操作结果保存(UserAddModel模型)
    {
    UserEntity exists=repository.Get(u=>u.Id==model.User.Id).FirstOrDefault();
    if(exists==null)
    {
    结果=repository.Save(model.User);
    HandleResult(结果、模型);
    }
    其他的
    {
    结果=repository.Save(model.User,PageMode.Edit);
    HandleResult(结果、模型);
    }
    ViewBag.Roles=角色;
    返回视图(“索引”,模型);
    }
    }
    }
    
    正如您所看到的,在我的视图中有两种不同的形式,我将整个视图模型存储在我的控制器中的会话中。但我认为这还不够好。如果会话过期,或者我必须使用负载平衡器部署应用程序,该怎么办

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


    提前感谢,

    您可以使用
    表单中的隐藏输入来维护“旧”用户。这不仅仅是存储旧用户。我必须显示搜索结果等。没有线索?如果我的问题不清楚,请询问细节。太长了,试着总结一下你想要的。附加的源代码太长。(在我看来…)