我有以下代码。
try
{
if (vm.SubmitAction == "Cancel")
return RedirectToAction("ShowSummary", new
{
ds = vm.Meta.DataSourceID
}); <------------------------------------------- xxxx
_account.ValidateNoDuplicate(vm.Account);
vm.Account.Modified = DateTime.Now;
vm.Account.ModifiedBy = User.Identity.Name;
_account.AddOrUpdate(vm.Account);
}
catch (Exception e) {
log(e); return View("CreateEdit", vm);
}
return RedirectToAction("ShowSummary", new {
ds = vm.Meta.DataSourceID
});
如果用户点击取消按钮,那么我有代码(此处标记为&lt; - xxxx)重定向到某个动作。此代码与try块之后的代码相同。有没有办法让我的代码退出try。我能想到的唯一方法是触发一个异常,我想要一个干净的跳转,而不是一个使用异常的方法,因为用户单击取消不是错误。
答案 0 :(得分:5)
切换if块条件:
// happens only when not cancelled
if (vm.SubmitAction != "Cancel")
try {
_account.ValidateNoDuplicate(vm.Account);
vm.Account.Modified = DateTime.Now;
vm.Account.ModifiedBy = User.Identity.Name;
_account.AddOrUpdate(vm.Account);
}
catch (Exception e) {
log(e); return View("CreateEdit", vm);
}
// happens always
return RedirectToAction("ShowSummary", new {
ds = vm.Meta.DataSourceID
});
答案 1 :(得分:3)
有一种方法可以手动退出try
catch
(带有goto
声明),但这是一种可怕的OO练习,应该避免使用。< / p>
将RedirectToAction
逻辑封装到方法中并调用它:
try
{
if (vm.SubmitAction == "Cancel")
return ShowSummary(vm);
_account.ValidateNoDuplicate(vm.Account);
vm.Account.Modified = DateTime.Now;
vm.Account.ModifiedBy = User.Identity.Name;
_account.AddOrUpdate(vm.Account);
}
catch (Exception e) {
log(e);
return View("CreateEdit", vm);
}
return ShowSummary(vm);
方法:
private ActionResult ShowSummary(MyViewModel vm)
{
return RedirectToAction("ShowSummary", new
{
ds = vm.Meta.DataSourceID
});
}
答案 2 :(得分:1)
我知道它不是最好的编程关键字,但是goto可以完成这项工作
try
{
if (vm.SubmitAction == "Cancel")
goto ShowSummary;
_account.ValidateNoDuplicate(vm.Account);
vm.Account.Modified = DateTime.Now;
vm.Account.ModifiedBy = User.Identity.Name;
_account.AddOrUpdate(vm.Account);
}
catch (Exception e)
{
log(e); return View("CreateEdit", vm);
}
ShowSummary:
return RedirectToAction("ShowSummary", new
{
ds = vm.Meta.DataSourceID
});