首页 > 解决方案 > 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;
}

如果我们偏离了正确的路径,希望让保护子句为我加载 TempData 并将使用引导回索引,其中我的视图中的逻辑将呈现错误消息。

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

合并这两个功能是个坏主意吗?

谢谢,

标签: c#asp.net-mvc

解决方案


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

  1. 覆盖控制器的OnActionExecuting方法:
        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" }));
           }
         }
    }

推荐阅读