2012-01-31 10 views
5

I zdefiniować zmienną jakoASP.MVC3 ModelState.IsValid nie obejmują RemoteAttribute sprawdzanie

public class EditModel 
{ 
    [Remote("IsNameAvailable", "Home", ErrorMessage = "Name is in use.")] 
    [Display(Name = "Name")] 
    public string Name{ get; set; } 
} 

i w kontrolerze Home

public JsonResult IsNameAvailable(string name) 
{ 
    if (duplicate) 
     return Json(false, JsonRequestBehavior.AllowGet); 
    else 
     return Json(true, JsonRequestBehavior.AllowGet); 
} 

ale kiedy sprawdzić ModelState.IsValid w Save działania, zawsze zwraca wartość true, nawet widzę komunikat o błędzie w widoku.

public ActionResult Save(EditModel editModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Return to view and display error in view 
     return View("Home", editModel); 
    } 

    //Input data is valid and save record 
    Repository.Save(editModel.Name); 
} 

[Problem]
Jak sprawdzenie ModelState również zasady walidacji przez RemoteAttribure w modelu?

Odpowiedz

2

Masz dwie opcje. Możesz zaimplementować interfejs IDataErrorInfo lub IValidatableObject i powtórzyć tam walidację. Te interfejsy są obsługiwane natychmiast po MVC, a Twoje ModelState to odzwierciedli.

Inną opcją jest tworzenie własnego atrybutu wywodzącego się z RemoteAttribute. W tym atrybucie niestandardowym dodaj logikę do zastosowania tej samej strony serwera sprawdzania poprawności.

Ostatnią opcją jest ta, którą wybrałbym, ale zajmuje to trochę więcej czasu. This question powinien ci w tym pomóc.

+0

Dzięki za sugestię! Chodzi o to, że mam wiele takich modeli i chcę znaleźć najlepszą opcję zmniejszenia kodu. Pierwsza i druga opcja wymaga kodu zależy od liczby modelu, który używa atrybutu zdalnego. Czy możesz wyjaśnić więcej z ostatniej opcji? – daniel

+2

Metoda IsValid metody RemoteAttribute faktycznie nazywa się serwerem. Jeśli spojrzysz na tę metodę za pomocą dekompilatora .NET, zobaczysz, że cała ta metoda ma wartość "return true;". Stwórz własny atrybut wywodzący się z RemoteAttribute i umieść pewną logikę walidacji w tej metodzie IsValid(). Na przykład możesz utworzyć dodatkową własność na swoim własnym atrybucie, powiedzmy ValidationMethod. Używając tego atrybutu, możesz przekazać dalej metodę, która powinna wykonać walidację. W metodzie IsValid() możesz wywołać tę metodę sprawdzania poprawności. –