使用asp.net mvc,用户更新他的个人资料。这是我的更新操作的外观:
[HttpPost]
public ActionResult EditUser(string id, UserEditViewModel model)
{
Mapper.CreateMap<UserEditViewModel, SimpleUser>();
var user = Mapper.Map<UserEditViewModel, SimpleUser>(model);
userService.EditUser(user);
//Re-populating the countries.
var countries = geoService.GetCountries();
model.Countries = countries.Select(c => new SelectListItem { Text = c.Name, Value = c.CountryId.ToString() });
return View(model);
}
首先,我这样做是否正确?通过编写两次填充代码的国家(GET中为1,此处为1)。
其次,如何向用户提供他们已成功更新其个人资料的某种形式的反馈?
答案 0 :(得分:2)
由于您已经为用户编辑页面创建了一个特定的视图模型(顺便说一下,很好的方法),我实际上会将该消息添加为该视图模型本身的属性。毕竟,它专门用于包含您的视图的数据,那么为什么通过将一个键/值对放入ViewData
来使事情变得复杂/增加不一致性?这就是我至少看到它的方式。
哦,顺便说一下,如果你使用Automapper,看起来你是(另一种不错的方法),你可以考虑把你的Mapper.CreateMap
放在除动作本身之外的某个地方。那里有一点开销。希望有所帮助。
答案 1 :(得分:1)
是的,我们通常需要两次查询,首先填充屏幕,第二次重新填充。您始终可以在第一次检索时缓存值,并使用回发操作上的缓存值重新填充屏幕。
在ViewData(MVC-2)或ViewBag(MVC-3)中设置您的消息并显示给用户。
答案 2 :(得分:1)
你可以:
ViewData
/ ViewBag
将消息传递给视图,然后视图就会显示此信息。答案 3 :(得分:0)
为所有这些东西创建一个模型的公共/帮助方法可能更好,例如:
private void SetupCountries() {
//Re-populating the countries.
var countries = geoService.GetCountries();
model.Countries = countries.Select(c => new SelectListItem { Text = c.Name, Value = c.CountryId.ToString() });
}
然后在控制器中的所有操作中,您只需调用它而无需再次键入这些代码。
public ActionResult EditUser(.... {
SetupCountries();
答案 4 :(得分:0)
我会用
TempData["StatusMessage"] = "Your messsaga"
您可以将tempdata用于下次请求之前所需的内容。