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=角色;
返回视图(“索引”,模型);
}
}
}
正如您所看到的,在我的视图中有两种不同的形式,我将整个视图模型存储在我的控制器中的会话中。但我认为这还不够好。如果会话过期,或者我必须使用负载平衡器部署应用程序,该怎么办
开发此类页面的最佳方式是什么?我愿意接受任何建议
提前感谢,您可以使用
表单中的隐藏输入来维护“旧”用户。这不仅仅是存储旧用户。我必须显示搜索结果等。没有线索?如果我的问题不清楚,请询问细节。太长了,试着总结一下你想要的。附加的源代码太长。(在我看来…)