Я пытаюсь использовать метод внутри моего контроллера, чтобы помочь с его проверкой (ПРИМЕЧАНИЕ. Я не могу использовать 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);
}
Но это не кажется правильным.
Мне любопытно, почему вы больше не в состоянии использовать DataAnnotations? Это потому, что генерируются ваши классы моделей? – asymptoticFault
Я использую Orchard CMS (не совсем вопрос). Orchard позволяет выполнять переводы с использованием специальной функции 'T'. Однако эта функция не работает с динамикой, поэтому я не могу втянуть, например, атрибут DataAnnotation, например '[Обязательный (ErrorMessage =« Пожалуйста, укажите имя »)]' и перевести его. Это нужно сделать вручную, чтобы можно было перевести. Поэтому, на мой взгляд, я мог бы использовать '@T (« Независимо »)' для переводов (например, для '
@asymptoticFault Забыл ссылку на свое имя, чтобы вы могли увидеть комментарий выше. – REMESQ