У меня много предложений.Для начала, прочитайте о Dependancy Injection и Inversion of Control (DI и IoC).Они сделают все эти эталонные экземпляры объектов ушедшими в прошлое.
Затем преобразуем эти построители списков для каждого в выражения Linq.Гораздо лаконичнее и, скорее, быстрее.
Затем, в вашем пост-обработчике, снова сделайте там то же самое.Кроме того, познакомьтесь с AutoMapper, который автоматически сопоставит ваше представление с классами доменов и сделает вашу жизнь намного проще.
Если вы это сделаете, ваш код будет сокращен в 2 раза, а может даже и в 3 раза.
РЕДАКТИРОВАТЬ:
Пример запроса linq, потому что я действительно не знаю определения ваших объектов ... будет выглядеть примерно так:
model.Cities = cityRepo.FindAllCities().Select(city => new SelectListItem() {
Text = city.Name, Value = city.CityId.ToString()}).ToList();
Обратите внимание, как выне нужно создавать новый список, так как он возвращается методом ToList ().Он также использует проекцию для выбора элементов в новом SelectListItem.
По сути, вы можете написать свой метод следующим образом, используя Dependancy Injection, Linq и AutoMapper (он выглядит длиннее, потому что мне пришлось разбивать строки несколько разчтобы соответствовать маленькому просмотру ТАК):
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);
}
}
}