Это правильный способ сохранить значения формы в MVC3? - PullRequest
2 голосов
/ 17 августа 2011

Вот мой код:

[HttpGet]
public ActionResult Register()
{
    RegisterViewModel model = new RegisterViewModel();
    using (CityRepository city = new CityRepository())
    {
        model.SelectCityList = new SelectList(city.FindAllCities().ToList(), "CityID", "CityName");
    }

    using (CountryRepository country = new CountryRepository())
    {
        model.SelectCountryList = new SelectList(country.FindAllCountries().ToList(), "CountryID", "CountryName");
    }

    return View(model);
}

[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        //Actually register the user here.
        RedirectToAction("Index", "Home");
    }            

    //Something went wrong, redisplay the form for correction.
    return View(model);
}

Это лучший подход или есть другой, более проверенный способ?Имейте в виду, что имена таблиц / полей моей базы данных не похожи на те, которые я объявил в своих моделях.Я должен очистить значения из ViewModel и поместить их в сгенерированный класс сущности, чтобы сохранить информацию.

Что-нибудь здесь, что кричит вам как неправильное?

Ответы [ 4 ]

1 голос
/ 17 августа 2011

Я использую этот шаблон и другой шаблон, который выглядит следующим образом (важная часть - часть AutoMapper):

[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
    if (!ModelState.IsValid)
    {
        // repopulate any input or other items set in GET
        // prefer to do at top due to ^^^ is easy to overlook
        return View(model);
    }

    // if it's an edit, pull to new instance
    // from the database and use automapper to
    // map over the submitted values from model to instance
    // then update instance in database
    //
    // VALUE: useful if form only shows
    // some of the properties/fields of model
    // (otherwise, those not shown would be null/default)

    // if it's new, insert

    RedirectToAction("Index", "Home");
}
0 голосов
/ 18 августа 2011

Рекомендуемые изменения на [HttpGet]:

[HttpGet]
public ActionResult Register()
{
    // Get
    var cities = new List<City>();
    var countries = new List<Country>();

    using (CityRepository city = new CityRepository())
    {
       cities = city.FindAllCities().ToList();
    }

    using (CountryRepository country = new CountryRepository())
    {
       counties = country.FindAllCountries().ToList();
    }

    // Map.
    var aggregatedObjects = new SomePOCO(cities, countries);
    var model = Mapper.Map<SomePOCO,RegisterViewModel>(aggregatedObjects );

    // Return
    return View(model);
}

Сводка изменений:

  • Расположите свою логику таким образом, чтобы работа контроллера имела смысл. Получить - Карта - Возврат. Именно задачи (по порядку), для которых предназначен Контроллер.
  • Используйте AutoMapper, чтобы сделать тяжелую работу по созданию ViewModel для вас.

Рекомендованные изменения в вашем [HttpPost]:

[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
    if (!ModelState.IsValid) 
      return View(model);

    try
    {
       var dbObj = Mapper.Map<RegisterViewModel,SomeDomainObj>(model);
       _repository.Save(dbObj);
       return RedirectToAction("Index");
    }
    catch (Exception exc)
    {
       if (exc is BusinessError)
          ModelState.AddModelError("SomeKey", ((BusinessError)exc).FriendlyError);
       else
          ModelState.AddModelError("SomeKey", Resources.Global.GenericErrorMessage);
    }

    return View(model);
}

Сводка изменений:

  • Попробуйте / поймать. Всегда нужно фиксировать исключения, будь то исключения домена или низкоуровневые (базы данных)
  • Сначала проверьте правильность ModelState. Как говорит @Cymen - сделай это сначала, чтобы потом не забыть
  • Добавить исключения в ModelState. Используйте пользовательские классы исключений для бизнес-ошибок с описательными сообщениями на основе ресурсов. Если ошибка слишком низкоуровневая для пользователя (ограничение внешнего ключа и т. Д.), Покажите общее сообщение
0 голосов
/ 18 августа 2011

Я предпочитаю этот шаблон:
Контроллер:

 [HttpGet]
        public ActionResult Index()
        {
            var cities= (from m in db.cities select m);
            ViewBag.Cities= cities;

            var states = (from m in db.States select m);
            ViewBag.States = states;

            return View();
        }
        [HttpPost]
         public ActionResult Index(RegisterViewModel model)
             {
             if (ModelState.IsValid)
                { 
                  // Saving the data
                  return View("ActionName", model);
                }
        return View();
    }


Вид:

@Html.DropDownList("DDLCities",new SelectList(ViewBag.Cities, "CityId" , "CityName" ), new { @class = "className" })
@Html.DropDownList("DDLStates",new SelectList(ViewBag.States, "StateId" , "StateName" ), new { @class = "className" })
0 голосов
/ 17 августа 2011

Это шаблон, который я обычно использую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...