我有一个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>
答案 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
}
}