Как отправить сообщение об ошибке из C # в Ajax, чтобы использовать содержимое этого сообщения об ошибке на стороне клиента?

2

В настоящее время я работаю, чтобы отправить сообщение об ошибке С# в Ajax. В С# я реализовал менеджер и контроллер, он работает нормально. Теперь моя цель отправлять сообщения об ошибках пользователю. Пользователь должен увидеть сообщение об ошибке на клиентской стороне, это всплывающее сообщение об ошибке имеет "ок" и "отмена". Я реализовал эту всплывающую функцию. Проблема в том, как я могу отправить эту ошибку с контроллера С#

Я добавил Throw Exception в С# manager, я вижу, что ошибка автоматически появляется на стороне клиента без обработки этой ошибки.

Контроллер С#

[HttpPatch]
[CatchException]
public IHttpActionResult ChangePositioningPlan(ChangePositioningPlan changeCommand)
    {
        changePositioingPlan.Process(changeCommand);
        return Ok("true");
    }

Менеджер С#

public void Process(ChangePositioningPlan command)
    {
        if (!command.Ids.Any())
        {
            throw new Exception("Please select Position Plan Template.");
        }
        int i = 0;
        foreach (var positioningPlanId in command.Ids)
        {
            var positioningPlanToChange = positioningPlanRepository.FindBy(positioningPlanId);

            positioningPlanToChange.ShippingSerieses.Clear();
            string[] shippingIds = Array.ConvertAll(command.ShippingIds[i].Split(','), p => p.Trim());
            var list = new List<ShippingSeries>();
            foreach (var shippingId in shippingIds)
            {

                var existingShippingId = shippingSeriesRepository.FilterBy(sid => shippingId == sid.ShippingId).FirstOrDefault();
                if (existingShippingId == null)
                {
                    throw new ArgumentException($"Shipping Id={shippingId} is not found.");
                }
                list.Add(existingShippingId);

                var checkExistingDateWithOtherPlanIds = positioningPlanRepository.FilterBy(d =>
                    positioningPlanToChange.DeliveryDate == d.DeliveryDate).ToList();
                //var test = checkExistingDateWithOtherPlanId.ShippingSerieses.Contains(existingShippingId);
                foreach (var existingPlanId in checkExistingDateWithOtherPlanIds)
                {
                    var checkPlanId = existingPlanId.ShippingSerieses.Contains(existingShippingId);
                    if (checkPlanId)
                    {
                        throw new ArgumentException($"Shipping Id Has already assigned to PlanId:" +
                                                    $"Shipping ID -> Plan ID " +
                                                    $"{existingShippingId.ShippingId} -> {existingPlanId.PlanId}, {positioningPlanToChange.PlanId}");
                    }

                }                  
            }
Теги:

2 ответа

2
Лучший ответ

Хорошо, исходя из ваших отзывов, давайте сделаем еще один (более чистый) снимок. Попробуйте что-то вроде этого:

public class ChangePositioningPlan
{
    public bool SomePropertyMissing { get; set; }
    public bool SomeOtherPropertyMissing { get; set; }
}

//This is your Manager class
public class SomeObject : ActionResult
{
    private ChangePositioningPlan _command;
    public SomeObject(ChangePositioningPlan command)
    {
        _command = command;
        _command.SomePropertyMissing = true; //Error 
    }
    public override void ExecuteResult(ControllerContext context)
    {
        if (_command.SomePropertyMissing)
        {
            context.HttpContext.AddError(new ArgumentException("GetFeedback: Something was not found!"));
            return; //Whether you want to return or continue execution?
        }
        if (_command.SomeOtherPropertyMissing)
        {
            context.HttpContext.AddError(new Exception("ShowInfo: Something else was not found!"));
            return; //Whether you want to return or continue execution?
        }
    }
}
public class HomeController : Controller
{
    public ActionResult Index(ChangePositioningPlan command)
    {
        return new SomeObject(command);
    }
}

Затем вы можете просто увидеть, содержит ли ответное сообщение GetFeedback или ShowInfo, отфильтровать это и показать вашу ошибку своим пользователям.

Там может быть потенциал для улучшения этого и удаления "ShowInfo" и "GetFeedback", но я не могу что-то придумать. Может быть, попробуйте задать другой вопрос, который конкретно касается этого

  • 0
    Я CS0266 Cannot implicitly convert type 'System.Web.Mvc.HttpStatusCodeResult' to 'System.Web.Http.IHttpActionResult'. изменения, но получаю ошибку: CS0266 Cannot implicitly convert type 'System.Web.Mvc.HttpStatusCodeResult' to 'System.Web.Http.IHttpActionResult'.
  • 0
    Извините за это, просто измените тип возврата вашего Action на ActionResult (вместо IHttpActionResult)
Показать ещё 6 комментариев
1

Выполните следующие шаги

  1. Создайте класс, как показано ниже, в качестве модели ответа для API.

    public class ResponseModel
    {
        /// <summary>
        ///  Gets or sets a value indicating whether Success or not
        /// </summary>
        public bool IsSuccess { get; set; }
    
        /// <summary>
        /// Gets or sets Error Message
        /// </summary>
        public string ErrorMessage { get; set; }
    }
    

    2. Модифицируйте свой метод как следующие, которые возвращают модель ответа вместо пустоты.

Менеджер С#

 public ResponseModel Process(ChangePositioningPlan command)
    {
        try
        {
            // your current method code
            ResponseModel response = new ResponseModel();
            response.IsSuccess = true;
            return response;
        }
        catch (Exception)
        {
            ResponseModel response = new ResponseModel();
            response.IsSuccess = false;
            response.ErrorMessage = "Your error message to show";
            return response;
        }
    }

Контроллер С#

3. вернуть ответ вместо "правда"

[HttpPatch]
[CatchException]
public IHttpActionResult ChangePositioningPlan(ChangePositioningPlan changeCommand)
{
    return Ok(changePositioingPlan.Process(changeCommand));
}

4. В интерфейсе прочитайте ответ и

var response =  received_reponse;

    if(response.IsSuccess == false)
    {
       var errormsg=response.ErrorMessage ;
      //show pop up and display error message
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню