Asp.net MVC контроллер опубликовать лучшие практики - PullRequest
2 голосов
/ 19 сентября 2011

Я немного озадачен вопросом о "наилучшей практике" контроллера.

Мой типичный код выглядит

    public ActionResult Edit(int reportId,FormCollection formCollection)
    {
        try
        {
            var report = _dbContext.EmployeeReports.Find(reportId);

            if (TryUpdateModel(report))
            {
                _employeeReportService.Update(report);
                return RedirectToAction("List");
            }

            return View("Edit", report);
        }
        catch (Exception)
        {
            // some logging etc
            return RedirectToAction("List");                
        }

Что ж, лучше использовать "TryUpdateModel" или только "UpdateModel" или простой вызов Model.IsValid, и это хорошая идея, чтобы перехватить исключение в контроллере?

Спасибо

Ответы [ 3 ]

5 голосов
/ 20 сентября 2011

Вот альтернативный способ, который я предпочитаю:

[HttpPost]
public ActionResult Edit(ReportViewModel reportViewModel)
{
    if (!ModelState.IsValid)
    {
        // there were validation errors => redisplay the form
        // so that the user can fix them
        return View(reportViewModel);
    }

    // At this stage the view model is valid => we can
    // map it back to a domain model and pass to the repository 
    // for processing

    // Fetch the domain model that we want to update
    var report = _repository.Get(reportViewModel.Id);

    // map the domain model properties from the view model properties
    // in this example I use AutoMapper
    Mapper.Map<ReportViewModel, Report>(reportViewModel, report);

    // perform update
    _repository.Update(report);

    // the update wen fine => we can redirect back to the list action
    return RedirectToAction("List");
}

Итак, как вы видите, нет FormCollection, нет TryUpdateModel, нет UpdateModel, нет try/catch.

0 голосов
/ 02 октября 2013

По моему мнению, вы всегда должны использовать модели представлений вместо форм коллекций, чтобы избежать проблем недостаточной публикации и повторной публикации.Поэтому, по моему мнению, лучше всего использовать модель представления для рендеринга и своего рода модель публикации / получения, которая точно соответствует тому, что вы хотите, чтобы пользователи отправляли / получали от действия.

Это может быть дополнительной работой, и некоторые модели представлений будут выглядеть очень похоже на модели, которые вы используете для привязки в действиях контроллера, но я бы сказал «Безопасность за удобство».

0 голосов
/ 22 сентября 2011

Это зависит от того, ожидаете ли вы и планируете ли работать с исключениями.

Мой обычный подход:

public ActionResult foobar(FormCollection formCollection)
{
    //Keep this out of the try catch scope in case you need to pass it
    // to the next method.
    Model model = new Model();

    try
    {
        if(!TryUpdateModel(model)
        {
            //Update Failed so fix it and redirect
            return redirectToAction("fixit");
        }
        if(!ModelState.IsValid())
        {
            //Update worked but model state was invalid, return to page to correct 
            //model validation errors
            return View("foobar", model);
        }
        //Update Succeeded so do other stuff
    }
    catch(Exception ex)
    {
        //Deal with Exception
        return redirectToAction("ErrorView", "ErrorController");
    }

    return redirectToAction("NextStep");
}

Я пытаюсь использовать их все в своем коде, чтобы попытаться поймать каждоевыдавать, прежде чем что-то сломается.

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