如果控制器中的筛选条件,则 C# mvc 5 退出



我试图干掉我的代码。我有一个控制器,它一遍又一遍地重复相同的代码,但我无法移动到新方法,因为重复的代码包含一个 return 语句。

下面是一个代码示例

public class ExampleController : Controller
{
private Authorizer _authorizer = new Authorizer();
public ActionResult Edit(int id)
{
//Repeated Code Start
var result = _authorizer.EditThing(id);
if (result.CanEditPartA)
{
//log attempted bad access
//Other repeted things 
return View("error", result.Message);
}
//Repeated Code End 
//unique logic to this action. 
return View();
}
public ActionResult Edit1(int id, FormCollection collection)
{
//Repeated Code Start
var result = _authorizer.EditThing(id);
if (result.CanEditPartA)
{
//log attempted bad access
//Other repeted things 
return View("error", result.Message);
}
//Repeated Code End
//unique logic to this action.
try
{
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
public class Authorizer
{
// check a bunch of things and determine if person can to something
public Result EditThing(int thingID)
{
//get thing from DB
//logic of thing compared to current user
//Create Result basied on bussness Logic
return new Result();
}

public class Result
{
public bool CanEditPartA { get; set; }
public bool CanEditPartB { get; set; }
public bool CanEditPartC { get; set; }
public string Message { get; set; }
}
}

}

这个例子在我的实际问题中被缩短了很多重复的代码

var result = _authorizer.EditThing(id);
if (result.CanEditPartA)
{
//log attempted bad access
//Other repeted things 
return View("error", result.Message);
}

我希望能够做这样的事情

public ActionResult Edit(int id)
{
if (CanUserEditPartA(id) != null)
{
return CanUserEditPartA(id);
}
//unique logic to this action. 
return View();
}
private ActionResult CanUserEditPartA(int id)
{
var result = _authorizer.EditThing(id);
if (result.CanEditPartA)
{
//log attempted bad access
//Other repeted things 
return View("error", result.Message);
}
return null;
}

但问题是当我返回 null 时。妖孽也退出了。

有没有办法有一个帮助程序方法,该方法在一个路径中的某个路径中返回 ActionResult,但如果为 null 或其他情况,则允许在主路径上继续?

这是使用 ActionFilter 的合适位置,通过正确应用它,您甚至不需要检查控制器操作的内部,如果过滤器没有通过要求,那么它将设置响应,并且控制器操作不会首先被调用。

这里有一个可以帮助你的链接:https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs

最新更新