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