ModelState.Clear не работает - PullRequest
       4

ModelState.Clear не работает

5 голосов
/ 16 февраля 2012

У меня есть простая контактная форма, встроенная в MVC, которая использует вспомогательный класс Html для создания текстового поля и раскрывающегося списка. Я хотел бы очистить значения текстовых полей и раскрывающийся список, чтобы они были такими, какими они были при визуализации страницы с использованием метода get (только после того, как запрос был отправлен правильно).

Я использую метод ModelState.Clear() для выполнения этой очистки, но мои значения в форме все еще остаются, есть идеи о том, что я делаю здесь неправильно? В случае успеха он отображает сообщение в коде. Ниже вы найдете копию кода с моего контроллера.

Спасибо, что нашли время!

[HttpPost]
public ActionResult Contact(ContactUsViewModel model)
{
    if (ModelState.IsValid)
    {
       bool isSuccess = _siteService.CreateInquiry(model.Inquiry);

       if (isSuccess)
       {
           model.SuccessMessage = "Thank you for contacting us.";
           ModelState.Clear();
       }
    }

    model.InquiryTypes = InquiryTypes;
    return View(model);
}

Ответы [ 4 ]

5 голосов
/ 16 февраля 2012

В случае успеха просто перенаправьте на свое действие GET, следуя шаблону Post-Redirect-Get :

public ActionResult Contact()
{
    var model = new ContactUsViewModel
    {
        SuccessMessage = TempData["SuccessMessage"] as string
    };
    return View(model);
}

[HttpPost]
public ActionResult Contact(ContactUsViewModel model)
{
    if (ModelState.IsValid)
    {
       bool isSuccess = _siteService.CreateInquiry(model.Inquiry);
       if (isSuccess)
       {
           TempData["SuccessMessage"] = "Thank you for contacting us.";
           return RedirectToAction("Contact");
       }
    }

    // since you are modifying the value of the InquiryTypes property
    // you need to remove it from the modelstate to avoid getting the 
    // old value rendered by the helpers
    ModelState.Remove("InquiryTypes");
    model.InquiryTypes = InquiryTypes;
    return View(model);
}

или поскольку я не большой поклонник TempData (поскольку он использует Session и лично я всегда отключаю его в своих приложениях), вы можете просто передать параметр строки запроса в действие Contact GET, например (success=1) и внутри это действие подготовит сообщение об успехе.

0 голосов
/ 11 сентября 2016

Вы должны создать новый объект модели рядом с вызовом ModelState.Clear (), например, в

model = new Vacancies(); 

ModelState.Clear();
0 голосов
/ 26 февраля 2014

Это немного поздно в игре, но я придумал следующий метод ClearModelState:

public void ClearModelState()
{
    var modelStateKeys = ModelState.Keys;
    var formKeys = Request.Form.Keys.Cast<string>();
    var allKeys = modelStateKeys.Concat(formKeys).ToList();

    var culture = CultureInfo.CurrentUICulture;

    foreach (var key in allKeys)
    {
        ModelState[key] = new ModelState { Value = new ValueProviderResult(null, null, culture) };
    }
}
0 голосов
/ 16 февраля 2012

Это потому, что ModelState является свойством Controller, а не тем, что содержит отправленные вами значения формы. Вот что вы хотели бы сделать:

if (ModelState.IsValid)
{
   bool isSuccess = _siteService.CreateInquiry(model.Inquiry);

   if (isSuccess)
   {
       model = new ContactUsViewModel();  // modified line
       model.SuccessMessage = "Thank you for contacting us.";
   }
}

model.InquiryTypes = InquiryTypes;
return View(model);

Свойство Controller.ModelState , как указано в MSDN:

Получает объект словаря состояний модели, который содержит состояние модели и привязки модели проверка .

Все, что я сделал в своем примере кода, это вынул вызов метода ModelState.Clear() и вставил model = new ContactUsViewMode();. Это случайный способ очистки ваших свойств данных ViewModel.

<ч />

Альтернативный процесс

Вы также можете сделать что-то подобное и изменить свою ViewModel:

public class ContactUsViewModel()
{
    // ... all of your existing view model members

    public void Clear()
    {
        this.SomeStringProperty = string.Empty;
        this.SomeIntProperty = 0;
        // ... so on and so forth
    }
}

И затем вместо создания нового экземпляра вашего класса ViewModel вы можете просто вызвать Clear() на существующем экземпляре:

if (ModelState.IsValid)
{
   bool isSuccess = _siteService.CreateInquiry(model.Inquiry);

   if (isSuccess)
   {
       model.Clear();  // modified line
       model.SuccessMessage = "Thank you for contacting us.";
   }
}

model.InquiryTypes = InquiryTypes;
return View(model);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...