Asp.net mvc 我应该使用TempData还是RedirectToAction?

Asp.net mvc 我应该使用TempData还是RedirectToAction?,asp.net-mvc,Asp.net Mvc,我的控制器上有一个删除操作。它会检查用户是否被允许删除 我的问题是,如果不允许删除: 我是否应该重定向回我的索引操作,该操作列出了所有可以删除的文件,并在TempData中向其传递一条错误消息,说明不允许删除此资源 或 我是否应该选择所有可以删除的文件,列出它们并在删除操作中显示所有错误 最佳做法是什么 注意:我不关心授权/身份验证。假设删除操作是通过HTTP post执行的,这通常是防止双重post的最佳做法,因此我选择使用临时数据重定向。在这种情况下,重复发布可能并不危险,但在其他条件相同的

我的控制器上有一个删除操作。它会检查用户是否被允许删除

我的问题是,如果不允许删除:

我是否应该重定向回我的索引操作,该操作列出了所有可以删除的文件,并在TempData中向其传递一条错误消息,说明不允许删除此资源

我是否应该选择所有可以删除的文件,列出它们并在删除操作中显示所有错误

最佳做法是什么


注意:我不关心授权/身份验证。

假设删除操作是通过HTTP post执行的,这通常是防止双重post的最佳做法,因此我选择使用临时数据重定向。在这种情况下,重复发布可能并不危险,但在其他条件相同的情况下,请选择一致性。

使用Post/Redirect/Get,这里是此“不记得”的筛选器属性,我在哪里发现:

/// <summary>
/// When a RedirectToRouteResult is returned from an action, anything in the ViewData.ModelState dictionary will be copied into TempData.
/// When a ViewResultBase is returned from an action, any ModelState entries that were previously copied to TempData will be copied back to the ModelState dictionary.
/// </summary>
public class ModelStateToTempDataAttribute : ActionFilterAttribute
{
    public const string TempDataKey = "__MvcContrib_ValidationFailures__";

    /// <summary>
    /// When a RedirectToRouteResult is returned from an action, anything in the ViewData.ModelState dictionary will be copied into TempData.
    /// When a ViewResultBase is returned from an action, any ModelState entries that were previously copied to TempData will be copied back to the ModelState dictionary.
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var modelState = filterContext.Controller.ViewData.ModelState;

        var controller = filterContext.Controller;

        if (filterContext.Result is ViewResultBase)
        {
            //If there are failures in tempdata, copy them to the modelstate
            CopyTempDataToModelState(controller.ViewData.ModelState, controller.TempData);
            return;
        }

        //If we're redirecting and there are errors, put them in tempdata instead (so they can later be copied back to modelstate)
        if ((filterContext.Result is RedirectToRouteResult || filterContext.Result is RedirectResult) && !modelState.IsValid)
        {
            CopyModelStateToTempData(controller.ViewData.ModelState, controller.TempData);
        }
    }

    private void CopyTempDataToModelState(ModelStateDictionary modelState, TempDataDictionary tempData)
    {
        if (!tempData.ContainsKey(TempDataKey)) return;

        var fromTempData = tempData[TempDataKey] as ModelStateDictionary;
        if (fromTempData == null) return;

        foreach (var pair in fromTempData)
        {
            if (modelState.ContainsKey(pair.Key))
            {
                modelState[pair.Key].Value = pair.Value.Value;

                foreach (var error in pair.Value.Errors)
                {
                    modelState[pair.Key].Errors.Add(error);
                }
            }
            else
            {
                modelState.Add(pair.Key, pair.Value);
            }
        }
    }

    private static void CopyModelStateToTempData(ModelStateDictionary modelState, TempDataDictionary tempData)
    {
        tempData[TempDataKey] = modelState;
    }
}
路由配置,以防万一:

    routes.MapRoute("Login", "login", new { controller = "Login", action = "Login" });

也许只是不让他们在不允许删除的项目上单击“删除”,你就不必处理这种情况了?我意识到这并不总是很方便…您使用的主键->整数或GUID是什么?您是在检查每个项目的删除权限,还是在检查用户是否可以执行一般的删除操作?我在检查一些与执行操作的用户权限无关的任意条件。我已经更新了原来的问题。从我读到的内容来看,人们似乎都同意,如果不更新服务器上的数据,对PGR不利。我不知道我会同意。就正确性而言,我认为这无关紧要。在ASP.NET MVC中,将ModelState复制到TempData并重定向是一种非常常见的模式。甚至还有解决方案。是的,我也不相信我是否同意诚实:
    routes.MapRoute("Login", "login", new { controller = "Login", action = "Login" });