2013-09-12 3 views
0

Я пытаюсь использовать метод внутри моего контроллера, чтобы помочь с его проверкой (ПРИМЕЧАНИЕ. Я не могу использовать DataAnnotations в моей ситуации). Но я ошибаюсь в логике/коде.Использование метода внутри контроллера для проверки вводов

Я использую [Serializable], чтобы обрабатывать шаги в мастере, поэтому мои действия с контроллером будут отображаться Details> Confirm> Submit. Действия контроллера принимают сериализованный параметр в моем контроллере, который вытягивается из модели просмотра (myData ниже).

Метод проверки:

private bool DetailsValidation() 
{ 
    bool validate = true; 

    if (String.IsNullOrEmpty(myData.FirstName)) 
    { 
     AddModelError("FirstName", T("Please specify a First Name.")); 
     validate = false; 
    } 

    if (!validate) 
    { 
     return false; 
    } 

    return ModelState.IsValid 
} 

Вот мои три действия в контроллере (детали> Подтвердить> Сохранить):

public ActionResult Details(string nextButton) 
{ 
    if ((nextButton != null) && ModelState.IsValid) 
     return RedirectToAction("Confirm"); 
    return View(myData); 
} 

public ActionResult Confirm(string backButton, string nextButton) 
{ 
    if (backButton != null) 
     return RedirectToAction("Details"); 
    else if ((nextButton != null) && ModelState.IsValid) 
    { 
     // code to add to DB 
     return RedirectToAction("Submitted"); 
    } 
    else 
     return View(myData); 
} 

public ActionResult Submitted() 
{ 
    // code to send e-mail 
    return View(myData); 
} 

В прошлом я сделал использовать DataAnnotations атрибуты, как [Required] а ModelState проверка будет работать без проблем. Но я не могу использовать это сейчас, следовательно, метод DetailsValidation. Тем не менее, если я применяю, что к Details действия Thusly (или с помощью HttpPost или поместить его перед return к действию Confirm):

public ActionResult Details(string nextButton) 
{ 
    if (DetailsValidation()) 
    { 
     if ((nextButton != null) && ModelState.IsValid) 
      return RedirectToAction("Confirm"); 
    } 
     return View(myData); 
} 

С выше код проверки достоверности модели срабатывает сразу после загрузки страницы (если используйте HttpPost в отдельном действии DetailsPOST, которого не бывает).

Теперь, если я использую HttpPost (простой Get действие, которое возвращает вид, а затем отдельное Post действие меченого DetailsPOST) Я вроде обойти эту проблему, за исключением того, что я создаю две новые проблемы.

Во-первых, если я перейду к отправке и перезагрузите страницу сведений, чтобы продолжить тестирование, она будет повторно заполнять форму с помощью предыдущих входов.

Во-вторых, если я использую список радиокнопок, вместо того, чтобы быть установленным на выбранной радиокнопке, он будет установлен на последнюю радиокнопку. Weird.

Любые мысли о том, как пройти через это. Я просто не знаю, как заставить DetailsValidation работать (без использования отдельных действий HttpPost). В противном случае, единственное, что я могу придумать, это сделать все проверки, которые у меня есть в DetailsValidation внутри действия контроллера, которое сделает для некоторых спагетти, подобных коду.

Спасибо.

РАЗВЕЙТЕ ВОПРОС:

было бы целесообразно, чтобы просто удалить ModelState.IsValid из действий и заменить его с моим частным способом проверки, как это:

public ActionResult Details(string nextButton) 
{ 
    if ((nextButton != null) && DetailsValidation()) 
     return RedirectToAction("Confirm"); 
    return View(myData); 
} 

Я чувствую, что я бы потерять из преимуществ ModelState.IsValid, или, может быть, это «нет-нет».

В противном случае, эта работа:

public ActionResult Details(string nextButton) 
{ 
    if ((nextButton != null) && ModelState.IsValid) 
     if DetailsValidation() 
      return RedirectToAction("Confirm"); 
    return View(myData); 
} 

Но это не кажется правильным.

+0

Мне любопытно, почему вы больше не в состоянии использовать DataAnnotations? Это потому, что генерируются ваши классы моделей? – asymptoticFault

+0

Я использую Orchard CMS (не совсем вопрос). Orchard позволяет выполнять переводы с использованием специальной функции 'T'. Однако эта функция не работает с динамикой, поэтому я не могу втянуть, например, атрибут DataAnnotation, например '[Обязательный (ErrorMessage =« Пожалуйста, укажите имя »)]' и перевести его. Это нужно сделать вручную, чтобы можно было перевести. Поэтому, на мой взгляд, я мог бы использовать '@T (« Независимо »)' для переводов (например, для '

+0

@asymptoticFault Забыл ссылку на свое имя, чтобы вы могли увидеть комментарий выше. – REMESQ

ответ

0

Вам необходимо наследовать класс ValidationAttribute и переопределить метод IsValid.

Чем вы могли бы обрабатывать всю вашу логику манипуляции с объектом ValidationContext

+0

Они сказали, что НЕ используют DataAnnotations, то есть атрибуты проверки. – asymptoticFault

+0

попробуйте использовать фильтры контроллера или действия для проверки запроса ur – user1956570

+0

@ user1956570 Не знаете, как использовать фильтр. Я думал о выполнении проверки в действии, но тогда мой код действия слишком занят, поэтому я подумал об использовании частного метода, чтобы он выглядел чище. Это может, однако (и, к сожалению), быть единственным путем. Если вы не можете предоставить пример фильтра? – REMESQ

Смежные вопросы