Asp.net mvc 3 有什么方法可以清除这个控制器代码吗?
我在MVC3上在线看到的大多数代码在控制器中只有很少的代码,但我似乎不知道如何使这些代码更加精简 也许如果你看一下,你可以提出改进建议。如果您需要查看我的UserModel类,请告诉我 这是帐户控制器的代码Asp.net mvc 3 有什么方法可以清除这个控制器代码吗?,asp.net-mvc-3,model,controller,Asp.net Mvc 3,Model,Controller,我在MVC3上在线看到的大多数代码在控制器中只有很少的代码,但我似乎不知道如何使这些代码更加精简 也许如果你看一下,你可以提出改进建议。如果您需要查看我的UserModel类,请告诉我 这是帐户控制器的代码 namespace WebUI.Controllers { public class AccountController : Controller { public ActionResult Register() { U
namespace WebUI.Controllers
{
public class AccountController : Controller
{
public ActionResult Register()
{
UserModel model = new UserModel();
EFCityRepository cityRepo = new EFCityRepository();
model.Cities = new List<SelectListItem>();
foreach (var city in cityRepo.FindAllCities()) {
model.Cities.Add(new SelectListItem { Text = city.Name, Value = city.CityId.ToString(), Selected = true });
}
EFGenderRepository genderRepo = new EFGenderRepository();
model.Genders = new List<SelectListItem>();
foreach (var gender in genderRepo.FindAllGenders()) {
model.Genders.Add(new SelectListItem { Text = gender.Name, Value = gender.GenderId.ToString(), Selected = true });
}
return View(model);
}
[HttpPost]
public ActionResult Register(UserModel model)
{
EFCityRepository cityRepo = new EFCityRepository();
model.Cities = new List<SelectListItem>();
foreach (var city in cityRepo.FindAllCities())
{
model.Cities.Add(new SelectListItem { Text = city.Name, Value = city.CityId.ToString(), Selected = true });
}
EFGenderRepository genderRepo = new EFGenderRepository();
model.Genders = new List<SelectListItem>();
foreach (var gender in genderRepo.FindAllGenders())
{
model.Genders.Add(new SelectListItem { Text = gender.Name, Value = gender.GenderId.ToString(), Selected = true });
}
if (ModelState.IsValid)
{
Domain.User user = new Domain.User();
user.UserRoleId = 1;
user.Nickname = model.Nickname;
user.Name = model.Name;
user.Lastname = model.Lastname;
user.GenderId = model.GenderId;
user.Address = model.Address;
user.Email = model.Email;
user.Telephone = model.Telephone;
user.MobilePhone = model.MobilePhone;
user.Carnet = model.Carnet;
user.DateOfBirth = model.DateOfBirth;
user.DateOfRegistry = DateTime.Now;
user.LastDateLogin = DateTime.Now;
user.IsActive = false;
user.LanceCreditBalance = 5;
user.LancesSpent = 0;
user.Login = model.Login;
user.Password = model.Password;
user.EmailVerificationCode = "TempTokenString";
user.CityId = model.CityId;
EFUserRepository repo = new EFUserRepository();
var result = repo.CreateUser(user);
if (result == UserCreationResults.Ok)
{
FormsAuthentication.SetAuthCookie(model.Nickname, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
{
switch (result)
{
case UserCreationResults.UsernameExists:
ModelState.AddModelError("", "El nombre de usuario ya esta siendo utilizado.");
break;
case UserCreationResults.EmailAlreadyExists:
ModelState.AddModelError("", "Ese correo ya esta en uso.");
break;
case UserCreationResults.NicknameAlreadyExists:
ModelState.AddModelError("", "El nickname ya esta siendo utilizado.");
break;
case UserCreationResults.UnknownError:
ModelState.AddModelError("", "Algo durante el registro. Por favor intente de nuevo.");
break;
default:
break;
}
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
}
}
名称空间WebUI.Controllers
{
公共类AccountController:控制器
{
公众行动结果登记册()
{
UserModel model=新的UserModel();
EFCityRepository cityRepo=新的EFCityRepository();
model.Cities=新列表();
foreach(城市报告中的var city.FindAllCities()){
model.Cities.Add(新SelectListItem{Text=city.Name,Value=city.CityId.ToString(),Selected=true});
}
EFGenderRepository genderRepo=新EFGenderRepository();
model.Genders=新列表();
foreach(genderRepo.FindAllGenders()中的变量gender){
model.Genders.Add(新SelectListItem{Text=gender.Name,Value=gender.GenderId.ToString(),Selected=true});
}
返回视图(模型);
}
[HttpPost]
公共操作结果寄存器(用户模型)
{
EFCityRepository cityRepo=新的EFCityRepository();
model.Cities=新列表();
foreach(城市报告中的var city.FindAllCities())
{
model.Cities.Add(新SelectListItem{Text=city.Name,Value=city.CityId.ToString(),Selected=true});
}
EFGenderRepository genderRepo=新EFGenderRepository();
model.Genders=新列表();
foreach(genderRepo.FindAllGenders()中的变量gender)
{
model.Genders.Add(新SelectListItem{Text=gender.Name,Value=gender.GenderId.ToString(),Selected=true});
}
if(ModelState.IsValid)
{
Domain.User User=new Domain.User();
user.UserRoleId=1;
user.Nickname=model.Nickname;
user.Name=model.Name;
user.Lastname=model.Lastname;
user.GenderId=model.GenderId;
user.Address=model.Address;
user.Email=model.Email;
user.Telephone=model.Telephone;
user.MobilePhone=model.MobilePhone;
user.Carnet=model.Carnet;
user.DateOfBirth=model.DateOfBirth;
user.DateOfRegistry=DateTime.Now;
user.LastDateLogin=DateTime.Now;
user.IsActive=false;
user.creditbalance=5;
user.lanesspent=0;
user.Login=model.Login;
user.Password=model.Password;
user.EmailVerificationCode=“试探安装”;
user.CityId=model.CityId;
EFUserRepository repo=新EFUserRepository();
var result=repo.CreateUser(用户);
if(result==UserCreationResults.Ok)
{
FormsAuthentication.SetAuthCookie(model.昵称,false/*createPersistentCookie*/);
返回重定向到操作(“索引”、“主页”);
}
其他的
{
开关(结果)
{
案例UserCreationResults.UserName存在:
AddModelError(“,“El nombre de usuario ya esta siendo utilizado.”);
打破
案例UserCreationResults.EmailAlreadyExists:
AddModelError(“,“Ese correo ya esta en uso.”);
打破
案例UserCreationResults.昵称ReadyExists:
AddModelError(“,”El昵称为ya esta siendo utilizado.);
打破
案例UserCreationResults.Unknown错误:
ModelState.addmodeleror(“,”Algo durante el registro.Por favor intent de nuevo.”);
打破
违约:
打破
}
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
}
}
我使用实体框架作为我的ORM,它会自动为我生成一个用户类。但是,我创建了一个User*Model*类,以便为视图添加数据注释。也许这是个错误的想法?我有很多建议。对于startes,请阅读依赖性注入和控制反转(DI和IoC)。他们将使所有样板对象实例化成为过去 接下来,将每个列表生成器的列表转换为Linq表达式。更简洁,也更可能更快 然后,在post处理程序中,再次执行相同的操作。此外,了解AutoMapper,它会自动将您的视图映射到域类,使您的生活更加轻松 如果你做了这些事情,你的代码将减少2倍,甚至3倍 编辑: 一个linq查询示例,因为我真的不知道对象的定义。。。看起来像这样:
model.Cities = cityRepo.FindAllCities().Select(city => new SelectListItem() {
Text = city.Name, Value = city.CityId.ToString()}).ToList();
请注意,您不必重新创建一个新列表,因为它是由ToList()方法返回的。它还使用投影将项目选择到新的SelectListItem中
基本上,您可以这样编写方法,使用依赖注入、Linq和AutoMapper(它看起来更长,因为我必须多次换行以适应如此小的视图):
名称空间WebUI.Controllers
{
公共类AccountController:控制器
{
私家侦探
namespace WebUI.Controllers
{
public class AccountController : Controller
{
private IGenderRepository _genderRepo;
private ICityrRepository _cityRepo;
private IUserRepository _userRepo;
public AccountController(IGenderRepository gr, ICityRepository cr,
IUserRepository ur)
{
_genderRepo = gr;
_cityRepo = cr;
_userRepo = ur;
}
public ActionResult Register()
{
UserModel model = new UserModel();
// Selected property is ignored by MVC on SelectListItems
model.Cities = _cityRepo.FindAllCities().Select(city =>
new SelectListItem() { Text = city.Name,
Value = city.CityId.ToString()}).ToList();
model.Genders = _genderRepo.FindAllGenders().Select(gender =>
new SelectListItem() { Text = gender.Name,
Value = gender.GenderId.ToString()}).ToList();
return View(model);
}
[HttpPost]
public ActionResult Register(UserModel model)
{
model.Cities = _cityRepo.FindAllCities().Select(city =>
new SelectListItem() { Text = city.Name,
Value = city.CityId.ToString()}).ToList();
model.Genders = _genderRepo.FindAllGenders().Select(gender =>
new SelectListItem() { Text = gender.Name,
Value = gender.GenderId.ToString()}).ToList();
if (ModelState.IsValid)
{
Domain.User user = Mapper.Map<Domain.User, Model>(model)
var result = _userRepo.CreateUser(user);
if (result == UserCreationResults.Ok) {
FormsAuthentication.SetAuthCookie(model.Nickname, false);
return RedirectToAction("Index", "Home");
} else {
ModelState.AddModelError("", GetErrorString(result));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
}
}