Zwracanie komunikatów z serwisu do kontrolera

0

Mam akcję kontrolera, która przyjmuje dane, a następnie, korzystając z metody serwisu, zapisuje do bazy danych. Natomiast metoda tego serwisu, odpowiedzialna za zapis do bazy danych, sprawdza pewną poprawność wykorzystując do tego inną metodę. Zakładając, że walidacja tą metodą wypadła niepoprawnie, jak zwrócić komunikat do kontrolera?

public ActionResult Create(ViewModelClass viewModel)
{
       if(ModelState.IsValid)
       {
              someService.SaveSomething(viewModel);
              return RedirectToAction("Index");
       }

       return View(viewModel);
}
public void SaveSomething(ViewModelClass viewModel)
{
          /* ... */
         if(CheckIfCorrect(viewModel.someProperty))
         {
                    /* ... zapis do bazy */
         }
}

public bool CheckIfCorrect(int someProperty)
{
          /* tutaj sprawdzam czy dane są OK i zwracam true lub false */
}
2

Możesz np. zmienić typ tego SaveSomething na string albo jakąś klasę/tupla który opakuje error i go zwrócić.

0

Masz na myśli coś takiego? Czy poniższe można uznać za prawidłowe rozwiązanie?

public class ServiceResponse
{
         public ResponseStatus Status { get; set;}  /* enum: Success, Error */
         public string ResponseMessage { get; set; }
}
public ActionResult Create(ViewModelClass viewModel)
{
       if(ModelState.IsValid)
       {
              var result = someService.SaveSomething(viewModel);

              if (result.Status == ResponseStatus.Error)
              {
                     ModelState.AddModelError(string.Empty, result.ResponseMessage);
                     return View(viewModel);
              }

              return RedirectToAction("Index");
       }
 
       return View(viewModel);
}
public ServiceResponse SaveSomething(ViewModelClass viewModel)
{
          /* ... */
         if(CheckIfCorrect(viewModel.someProperty))
         {
                    /* ... zapis do bazy */

                   return new ServiceResponse(ResponseStatus.Success, string.Empty);
         }

         return new ServiceResponse(ResponseStatus.Error, "someProperty is not correct!");
}
1

Masz na myśli coś takiego?

tak, ewentualnie niektórzy tez zamiast klasy stosują po prostu ValueTuple np.

public (YourEnum Status, string ResponseMessage) SaveSomething

Z naciskiem na to, aby w twoim result w podpowiedziach wyskakiwały normalne nazwy, a nie Item1, Item2.

Czy poniższe można uznać za prawidłowe rozwiązanie?

Wydaje mi się, że tak, chociaż zawsze można zapytać Googla :

https://codereview.stackexchange.com/questions/135945/validation-that-also-returns-error-messages

https://codereview.stackexchange.com/questions/63049/returning-status-codes-from-business-layer (Status Codes as Return Values)

Niektórzy też czasem preferują wyjątki https://codereview.stackexchange.com/a/63122

Ale to nie mnie pytać :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1