ASPNet MVC - 在控制器方法中,返回字符串列表或重定向到不同的页面



我正在尝试练习 DRY(不要重复自己(基础知识,并注意到我的控制器中有很多这样的构造,用户点击和端点,可能没有提供我需要的一些信息。

public ActionResult doSomething(string jsonArray){
List<string> deserializedJson = JsonConvert.DeserializeObject<List<string>>(jsonArray);
if (deserializedJson.Count == 0){
TempData["Error"] = "You must select one or items for this type of request";
return Redirect("Index");
}
//business as usual stuff here
}

我执行客户端验证,所以我们不应该在这里结束,但我也喜欢在继续我的控制器之前检查值。 但是,这恰好五行无处不在,所以我认为将其变成一种私有方法并像保护条款一样使用它会很好。

private List<string> getJson(string jsonArray){
List<string> deserializedJson = JsonConvert.DeserializeObject<List<string>>(jsonArray);
if (deserializedJson.Count == 0){
TempData["Error"] = "You must select one or items for this type of request";
return Redirect("Index");
}
return deserializedJson;
}

希望是,如果我们偏离了快乐的道路,则让 guard 子句为我加载 TempData,并将使用引导回索引,其中我的视图中的逻辑会呈现错误消息。

但是,我似乎无法弄清楚如何使此方法完成双重职责,如果一切正常,则返回字符串列表,如果没有,则重定向用户。

合并这两个函数是个坏主意吗?

谢谢

不确定我是否正确满足您的需求,但我想您想验证控制器方法的输入参数。有两种方法:

  1. 覆盖控制器的OnActionExecute方法:
private List<string> getJson(string jsonArray)
{
List<string> deserializedJson = JsonConvert.DeserializeObject<List<string>>(jsonArray);
return deserializedJson;
}
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.ActionParameters.ContainsKey("jsonArray"))
{
List<string> deserializedJson = getJson((string)filterContext.ActionParameters["jsonArray"]);
if (deserializedJson.Count == 0)
{
filterContext.Controller.TempData["Error"] = "You must select one or items for this type of request";
filterContext.Result = new RedirectResult("Index");
}
}
}
public ActionResult doSomething(string jsonArray)
{
List<string> deserializedJson = getJson(jsonArray);
//business as usual stuff here
}
  1. 创建一个过滤器并将其应用于每个方法:
[CheckArray]
public ActionResult doSomething(string jsonArray)
{
List<string> deserializedJson = getJson(jsonArray);
//business as usual stuff here
}
public class CheckArrayAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
List<string> deserializedJson = getJson((string)filterContext.ActionParameters["jsonArray"]);
if (deserializedJson.Count == 0)
{
filterContext.Controller.TempData["Error"] = "You must select one or items for this type of request";
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = filterContext.RequestContext.RouteData.Values["controller"], action = "Index" }));
}
}
}

最新更新