1

ASP.NET MVC 2.0

Post-Redirect-Getを実行しています。投稿でエラーが発生した場合は、-Redirect-Getルートに沿って移動するためにModelErrorsを含める必要があります。'TempData'を介して送信します:

TempData["modelErors"] = 
    ModelState.
        Where(item => item.Value.Errors.Count > 0).
        ToDictionary(
            item => item.Key, 
            item => item.Value.Errors.Select(error=>error.ErrorMessage).ToList()
        );

そして、それをModelStateに再挿入します。

if (TempData.ContainsKey("modelErors")) {
    foreach (var errors in (IDictionary<string,IList<string>>) TempData["modelErors"]) {
        foreach (var error in errors.Value) {
            ModelState.AddModelError(errors.Key, error);
        }
    }
}

もっと良い方法はありますか?

4

2 に答える 2

2

投稿が成功した後にのみ、PRGを実行する必要があります。それ以外の場合は、エラーが発生した場合に投稿から戻ることができます。

それ以外の場合は、Cookie、セッション、またはリクエスト変数を使用して、次のリクエストのためにその情報を保存する必要があります。

ASP.NET MVC2では、デフォルトで、TempDataはセッション状態を使用して次の要求の情報を格納すると思います。

于 2010-06-25T14:24:53.347 に答える
0

最もクリーンな解決策は、次のようなActionFilterAttributeを使用することだったと思います。

public class RedirectErrorAttribute : ActionFilterAttribute
{
    #region Methods & Function
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.Controller.TempData.ContainsKey("modelErrors"))
        {
            foreach (var errors in (Dictionary<string, List<string>>)filterContext.Controller.TempData["modelErrors"])
                foreach (var error in errors.Value)
                    filterContext.Controller.ViewData.ModelState.AddModelError(errors.Key, error);
        }

        base.OnActionExecuting(filterContext);
    }
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if (filterContext.Controller.ViewData.ModelState.Values.Any(x => x.Errors.Count > 0))
        {
            if (filterContext.Controller.TempData.ContainsKey("modelErrors"))
                filterContext.Controller.TempData.Remove("modelErrors");
            else
            {
                filterContext.Controller.TempData["modelErrors"] =
                    filterContext.Controller.ViewData.ModelState.
                    Where(item => item.Value.Errors.Count > 0).
                        ToDictionary(
                            item => item.Key,
                            item => item.Value.Errors.Select(error => error.ErrorMessage).ToList()
                        );

                filterContext.Controller.TempData.Keep("modelErrors");
            }
        }

        base.OnResultExecuted(filterContext);
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        base.OnResultExecuting(filterContext);
    }

    #endregion
}

エラーをスローするアクションとエラーを受け取ったアクションの先頭に属性を配置する必要がある場合は、次のようになります。

[RedirectError]
public ActionResult Delete(Guid id)
{

[RedirectError]
public ActionResult Get(Guid id)
{

そして、それはクリーンで管理しやすいコードを備えた魅力のように機能します。

この助けを願っています!

ジュリアン

于 2011-04-20T18:00:47.420 に答える