2012-06-29 1 views
0

Я использую PRG для очистки моих сообщений в MVCОчистка после действия в MVC

О действии POST Я хранить ModelState контроллера в TempData, используя действие фильтр, а затем перенаправить к методу 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 }) 
} 

, если произошла ошибка ввода в действие пост добавить ошибку в ModelState которой Аннулирует ModelState, а затем перенаправляет к действию ГЭТ.

Мой вопрос в том, как лучше всего определить в действии GET «Сведения», которое было в состоянии ошибки после сообщения? Если модельное состояние было недействительным, я хочу пропустить логику ...

var object = load(id); 

в действии GET. Я пробовал ModelState.IsValid, но это не работает.

+0

Вы можете задать ModelState, если его действительным (он будет проверять себя на основе аннотаций данных): если (ModelState.IsValid!) {// сделать вещь}. Вы также можете добавить свои собственные ошибки modelstate для «специальных» валидаций: ModelState.AddModelError (yourProperty, aMessage); .. Хотя я не уверен, что я действительно понимаю ваш вопрос .. –

+0

@ Team-JoKi Он использует фильтр действий, который импортирует TempData из запроса POST, поэтому он следует шаблону PRG. POST для действия и ModelState действителен, перетаскивает состояние модели в TempData, а затем перенаправляет на действие GET, которое затем импортирует этот ModelState, чтобы в форме были выделены правильные валидаторы и т. Д. – Dismissile

+0

Не нужно ли просто проверять «если modelState .IsValid ... сделать перенаправление? Else просто вернуть модель к виду, на котором вы были? Вы хотите проверить достоверность перед запуском любого обновления. –

ответ

1

Вы могли бы попробовать что-то вроде этого:

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

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

В контроллере вы можете проверить TempData [ "IsValid"] поле вместо ModelState.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); 
     } 
    } 
} 
+0

Мысль о сохранении TempData [key] для альтернативной проверки для Modelstate.IsValid, но хотела узнать, есть ли другой способ. благодаря –