2016-11-11 1 views
0

Я бы хотел показать сообщение о состоянии пользователю после обновления страницы профиля, чтобы указать, было ли это успешным или нет. Вот что у меня есть:возвращение сообщения об успешном завершении/сбое для просмотра после обновления базы данных

Контроллер

[HttpPost] 
public ActionResult Profiles(UserProfile model) 
{ 
    try 
    { 
     _userRepository.UpdateUserProfile(model); 
     ViewBag.Message = "Success"; 
    } 
    catch 
    { 
     ViewBag.Message = "Failure"; 
    } 
    return View(); 
} 

База данных вызовов

public void UpdateUserProfile(UserProfile user) 
{ 
    using (var connection = new SqlConnection(SQLSettings.GetConnectionString())) 
    { 
     var p = new DynamicParameters(); 
     p.Add("@Id", user.Id); 
     p.Add("@City", user.City); 
     p.Add("@State", user.State); 
     connection.Execute("UpdateUserProfile", p, commandType: CommandType.StoredProcedure); 
    } 
} 

VIEW

@if (ViewBag.Message == "Success") 
{ 
    <div class="alert alert-success"><strong><span class="glyphicon glyphicon-check"></span> Your profile has been updated.</strong></div> 
} 
@if (ViewBag.Message == "Failure") 
{ 
    <div class="alert alert-danger"><span class="glyphicon glyphicon-alert"></span><strong> Error, please try again.</strong></div> 
} 

Whil e, похоже, это работает для меня, я предполагаю, что существует более логичный путь?

+0

Что вы подразумеваете под «более логичным способом»? Здесь нет ничего плохого в вашем коде. –

+2

Вы должны действительно передать модель на свой взгляд, а не использовать ViewBag. – DavidG

+0

Я предполагаю, что я не был уверен, должен ли 'try-catch' находиться в контроллере или в фактическом методе, вызывающем вызов db, и возвращать отсюда успех или ошибку? – PixelPaul

ответ

1

Вы должны действительно рассмотреть возможность переключения на шаблон PRG в этом прецеденте. PRG означает POST - REDIRECT - GET. В этом подходе после успешного завершения транзакции (например: Обновление пользовательской записи) вы возвращаете ответ перенаправления на клиентский браузер с новым местоположением, и браузер сделает совершенно новый HTTP-вызов для загрузки этого метода действия GET.

Вы можете передать TempData для передачи сообщения об успешном завершении. Если при успешном завершении операции произошла ошибка, вы можете использовать ModelState.AddModelErrorMethod, чтобы добавить ошибку в словарь состояния модели.

[HttpPost] 
public ActionResult Profiles(UserProfile model) 
{ 
    try 
    { 
     _userRepository.UpdateUserProfile(model); 
     TempData["Message"] = "Success"; 
     return RedirectToAction("Profiles",new { id= model.Id }); 
    } 
    catch 
    { 
     ModelState.AddModelError(string.Empty,"Some error happened"); 
     return View(model); 
    } 
} 

Теперь в вашем GET действия (Profiles? ID = someId), вы в основном нужно проверить значение TempData и отобразить его по мере необходимости.

При обнаружении ошибки в представлении (Profiles), вы можете использовать вспомогательный метод Html.ValidationSummary, чтобы отобразить сообщение об ошибке, которое мы добавили в словарь состояния модели.

+1

Спасибо за столь подробное объяснение, это было очень полезно. – PixelPaul

Смежные вопросы