0

MVCでの投稿のクリーンアップにPRGを使用しています

POSTアクションでは、アクションフィルターを使用してコントローラーのmodelstateをtempdataに格納してから、modelstateを再ロードするGETメソッドにリダイレクトします。

GETおよびPOSTアクションヘッダー:

[ImportModelStateFromTempData]
public ActionResult Details(int id) { 
    var object = load(id);
    return View(object);
}

[HttpPost]
[ExportModelStateToTempData]
public ActionResult Details(MyViewModel model) { 
    update(model); return RedirectToAction("Details", new { id = model.id }) 
}

エラーが発生した場合は、postアクションで、modelstateにエラーを追加します。これにより、modelstateが無効になり、getアクションにリダイレクトされます。

私の質問は、GET "Details"アクションで、モデルが投稿後にエラー状態にあったことをどのように判断できるかということです。modelstateが無効だった場合、ロジックをスキップしたい...

var object = load(id);

GETアクションで。ModelState.IsValidを試しましたが、機能しません。

4

1 に答える 1

1

あなたはこのようなことを試すことができます:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;

    if( !modelState.IsValid )
    {
        filterContext.Controller.TempData.Add("IsValid", false);
    }
}

コントローラでは、ModelState.IsValidの代わりにTempData["IsValid"]フィールドを確認できます。

if( TempData["IsValid"] != null ) // do whatever here, or skip code etc.

アクションフィルターコードがOnActionExecutingメソッドにどのように含まれているかに注目してください。YOuは、既存のコードをOnActionExecutedに保持します。

public void OnActionExecuting(ActionExecutingContext filterContext)
{         ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;

    if (modelState != null)
    {
        if (filterContext.Result is ViewResult)
        {
            filterContext.Controller.ViewData.ModelState.Merge(modelState);
        }
        else
        {
            filterContext.Controller.TempData.Remove(Key);
        }
    }
}
于 2012-06-29T13:53:48.190 に答える