В настоящее время я работаю, чтобы отправить сообщение об ошибке С# в 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}");
}
}
}
Хорошо, исходя из ваших отзывов, давайте сделаем еще один (более чистый) снимок. Попробуйте что-то вроде этого:
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", но я не могу что-то придумать. Может быть, попробуйте задать другой вопрос, который конкретно касается этого
Выполните следующие шаги
Создайте класс, как показано ниже, в качестве модели ответа для 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
}
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'.