c# - 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 并将使用引导回索引,其中我的视图中的逻辑将呈现错误消息。
但是,如果一切正常,我似乎无法弄清楚如何使此方法执行双重任务,即如果一切正常,则返回字符串列表,如果没有,则重定向用户。
合并这两个功能是个坏主意吗?
谢谢,
解决方案
不确定我是否正确地满足了您的需求,但我想您想验证控制器方法的输入参数。有两种方法:
- 覆盖控制器的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
}
- 创建一个过滤器并将其应用于每个方法:
[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" }));
}
}
}
推荐阅读
- spring-boot - Spring Boot Azure Functions 项目不适用于 Kotlin
- r - 在ggplot2中可视化的累积值
- microsoft-graph-api - 如何从 javascript sdk 或 graph sdk 获取 Microsoft Teams 中的会议详细信息?
- python - 气流一次重新运行一个 dag 实例
- javascript - 使用 React.Context 注入 UI 组件是个好主意吗?
- c - 可以将 RAW 套接字绑定到 ip:port 而不是接口吗?
- amazon-web-services - terraform 12 计数 date_template 不起作用
- macos - 工作流程中 Opencv 出现 CMAKE 错误(github 操作)
- javascript - 从当前页面获取 HTML - Chrome 扩展
- javascript - Phaser 加载图像不会在点击事件上设置为 alpha