重复检查失败,我将返回ActionResult

时间:2014-03-13 22:43:17

标签: asp.net-mvc

我有一个MVC的存储库模式实现。

我正在检查用户是否存在电子邮件,如果确实存在,我想将某些内容返回Actionresult,但我不确定是什么。

 public void CreateCustomer(Customer customer)
    {
        bool duplicate = false;

        _ctx.AddToCustomers(customer);

        var txt = customer.Email;

        duplicate = CheckDuplicate(txt);
        if (!duplicate)
        {
            _ctx.SaveChanges();
        }
        else
        {
            // Do something
        }
    }

在我做的事情上,它会像http异常吗?我将如何在ActionResult方面处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

在您的控制器操作方法中,您可能会返回模型错误并在视图中显示该错误。

ModelState.AddModelError("","Customer already exists");
return View(customer)

假设您的视图具有帮助方法,以向用户显示错误详细信息。

@Html.ValidationSummary()

如果您使用其他方法进行重复检查,则可能会返回一个适当的值,表明存在重复记录/所有内容都按预期工作。您可以将枚举/类作为返回类型,也可以将自定义异常返回给调用代码。

自定义类作为返回类型

public class TransactionResponse
{
  public bool IsSuccess { set;get;}
  public string ErrorType { set;get;}
  public string ErrorDetails { set;get;}
}

并将此类用作返回类型

public TransactionResponse CreateCustomer(Customer customer)
{
  //if success
  return new TransactionResponse { IsSuccess=true};
  //if error
  return new TransactionResponse { ErrorType="Duplicate"};
}

另一种方法是抛出异常。

抛出自定义异常

public class DuplicateException : Exception
{
  public DuplicateException(string message):base(message)
  {

  }
}

并且在您的方法中,当您知道记录已经存在时,抛出异常的实例

if(duplicate)
{
  throw new DuplicateException("Customer exists");
}
else
{
  //save
}

并在您的调用代码中处理此异常并执行必要的操作(向用户显示消息)

public ActionResult Create(CustomerViewModel model)
{
  try
  {
    //call the code to your other method here
    //If everything is succesful, Redirect (PRG pattern)
    return RedirectToAction("CustomerCreated");
  }
  catch(DuplicateException ex)
  {
    //Show error message to user. ModelState.AddModelError or any other means

  }
  catch(Exception ex)
  {
    // some other error happened. deal with that now
    // to do :log the error
  }

}