8

Utworzono częściowy widok w aplikacji MVC 3. Pogląd ten ma silnie typami modelu takiego:ASP.NET MVC PartialView nie wydziela znaczników sprawdzania poprawności

public class ProductViewModel 
{ 
    [Required, Display(Name = "Product price")] 
    public decimal? ProductPrice 
    { 
     get; 

     set; 
    } ... 
} 

W moim metody działania I wywołać metodę PartialView jak ten

PartialView("ProductViewModel", products[0]); 

Ale na stronie nie widzę żadnych znaczników dla logiki walidacji jednak i nic się nie dzieje, jeśli na stronie są jakieś błędy. Jeśli użyję tego widoku częściowego jako szablonu edytora, zadziała. Każda pomoc jest doceniana.

Edycja: Aby być bardziej szczegółowym, mam formularz HTML i chcę dodać znacznik do niego poprzez aktualizację ajaxową (jeśli użytkownik kliknie przycisk, chcę dodać nowy znacznik do tego formularza). Jeśli statycznie dołączę te formanty, mam na myśli to, że jeśli je wyrenderuję po załadowaniu strony, sprawdzanie poprawności działa, ale jeśli dodaję formanty do tej formy przez wywołanie ajax, nie wstawi się znaczników sprawdzania poprawności dla tych formantów. Moja częściowy widok wygląda następująco:

@Html.LabelFor(x => x.ProductPrice) 

@Html.TextBoxFor(x => x.ProductPrice) 

@Html.ValidationMessageFor(x => x.ProductPrice) 

moja postać wygląda następująco:

@using (Html.BeginForm()) 
{ 
    <div id="div_Products"> 
     @Html.EditorFor(x => x) 
    </div> 

    <input type="submit" value="Compare" /> 
} 

Powyższy kod działa dobrze, działa walidacji. Na stronie serwera I wywołać metodę działania, która wygląda tak:

[HttpPost] 
public ActionResult InsertProduct() 
{ 
    var newProductVM = new ProductViewModel{ ProductPrice = 789 }; 

    return PartialView("~/Views/Nutrition/EditorTemplates/ProductViewModel.cshtml", newProductVM); 
} 

zorientowali się, że silnik MVC wstawia tych znaczników walidacji tylko wtedy, gdy uzna, że ​​kontrole są wewnątrz formantu formularza. Kiedy próbuję aktualizować kontrolę formularza za pośrednictwem wywołania ajax, MVC nie ma możliwości, aby wiedzieć, że będą one umieszczone w elemencie formularza i dlatego nie wydaje żadnej logiki sprawdzania poprawności dla nich, jak przypuszczam.

+0

To ma sens, że redaktor "emituje" błędy sprawdzania poprawności i takie, i że widok nie. Czy widzimy kod dla twojego widoku? – rfmodulator

+0

Problem polega na tym, że MVC wstawia znaczniki sprawdzania poprawności tylko wtedy, gdy wykryje, że formanty są w formularzu. Problem polega na tym, że chcę dodać znaczniki do formantu formularza poprzez aktualizację ajax, ale w ten sposób silnik MVC nie wie, że ten znacznik zostanie wstawiony do elementu formularza, a zatem nie będzie wysyłał żadnych znaczników sprawdzania poprawności. – Zoliqa

+0

Możesz wymusić to za pomocą jakiegoś kodu Html.ValidationMessageFor(). Tak jak powiedziałem, pokaż nam swój widok. – rfmodulator

Odpowiedz

1

Czy aktywowałeś walidację bez zastrzeżeń w web.config lub w samym widoku?

w web.config:

<configuration> 
    <appSettings> 
     <add key="ClientValidationEnabled" value="true"/> 
     <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
    </appSettings> 
</configuration> 

lub kod wewnątrz:

HtmlHelper.ClientValidationEnabled = true; 
HtmlHelper.UnobtrusiveJavaScriptEnabled = true; 
+0

Jego sprawdzanie poprawności działa poprawnie w edytorze, więc mówi nam, że konfiguracja jest poprawna. – rfmodulator

2

W swojej częściowym widokiem, dodaj (C#/Razor):

@Html.ValidationMessageFor(model => model.ProductPrice) 
0

Korzystanie walidacji klienta , możliwe jest ponowne sprawdzenie poprawności elementów załadowanych po załadowaniu strony. Ponieważ MVC używa teraz sprawdzania poprawności jQuery, jeśli masz włączone sprawdzanie poprawności klienta;

jquery validate - validating a field on pageload

To może pomóc.

10

umieścić to w górnej części częściowym widokiem, a otrzymasz wiadomość walidacji renderowany do wyjścia html:

if (this.ViewContext.FormContext == null) 
{ 
    this.ViewContext.FormContext = new FormContext(); 
} 

Jeśli używasz Ajax dodać pól formularza można wywołać nowe pola do dodane do sprawdzania poprawności, gdy zostały one dodane do DOM/Strona używając coś takiego:

$("form").removeData("validator"); 
$("form").removeData("unobtrusiveValidation"); 
$.validator.unobtrusive.parse("form"); 

EDIT/UPDATE (23 Fed 2013): ja właśnie włamał się FormContext z częściowym widokiem na po raz pierwszy w Visual Studio 2012 i wydaje się, że z najnowszymi wersjami jQuery i Validation itp. Nie muszę dodawać 3 linii javascript (powyżej), aby sprawdzanie poprawności działało dynamicznie na ajax, co jest świetne!

+0

To działało, ale nie jestem pewien, czy rozumiem dlaczego. –

+0

@ChrisJackson - cóż, patrząc na problem wyłącznie z perspektywy black-box wysokiego poziomu, byłoby sprawiedliwe, aby powiedzieć, że Html.ValidationMessageFor szuka Non-null FormContext - który zwykle jest ustawiony przy użyciu czegoś podobnego do używania (Html.BeginForm) {- i jeśli go nie znajdzie, to nie przeszkadza w renderowaniu wiadomości sprawdzania poprawności. Domyślam się, że walidacja JS wymaga formularza, aby działał poprawnie, więc nie ma sensu posiadanie wiadomości walidacyjnych. IMO to niedopatrzenie ze strony zespołu .Net. – Rob

+1

@Rob, dzięki, to wyleczyło mnie z bólu głowy! – Netricity

2

Nie wiem, czy to nadal jest dla ciebie problemem, lecz rozwiązaniem byłoby zadzwonić:

$.validator.unobtrusive.parse($('#your-new-form-div')); 

po załadowaniu postaci znaczników/kontrole poprzez AJAX. Analizuje on nowe elementy formularza i tworzy sprawdzanie poprawności klienta określone w widoku.

+0

Bez względu na to, czy było to dla niego problemem, był to dla mnie problem. Przeszukałem wszystkie interwebz przez całe dziwne popołudnie, szukając tego, wiedząc, że będzie to miało na celu ponowne zatwierdzenie walidacji. Żałuję tylko, że mam tylko jeden upominek do wydania. Dziękuję, życzliwy panie, ponieważ mogę teraz przestać wbiec głową do tego muru, który został poplamiony wieloma kufli mojej krwi. Och, nie powiedziałem $ ("# mój-nowy-formularz-div"), powiedziałem "$" ("formularz") i nadal działało. FYI. – vbullinger