8

Я создал частичный вид в приложении MVC 3. Эта точка зрения имеет сильно типизированную модель так:ASP.NET MVC PartialView не выделяет разметку проверки

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

     set; 
    } ... 
} 

В моем методе действий я вызвать метод PartialView как этого

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

Но на странице я не могу видеть разметку для логики проверки, однако и ничего не происходит, если на странице появляются ошибки. Если я использую это частичное представление в качестве шаблона редактора, он работает. Любая помощь приветствуется.

Редактировать: Чтобы быть более конкретным, у меня есть HTML-форма, и я хочу добавить к ней разметку с помощью ajax-обновления (если пользователь нажимает на кнопку, я хочу добавить новую разметку в эту форму). Если я включаю эти элементы управления статически, я имею в виду, если я их создаю, когда страница загружается, проверка выполняется, но если я добавлю элементы управления в эту форму с помощью вызова ajax, для этих элементов управления не будет вставлена ​​метка проверки. Мой частичный вид выглядит следующим образом:

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

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

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

Моя форма выглядит следующим образом:

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

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

Код выше работает хорошо, проверка работы. На стороне сервера я вызвать метод действия, который выглядит как:

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

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

я понял, что двигатель MVC, вставляет эти проверки разметки, только если он находит, что элементы управления находятся внутри элемента формы. Когда я пытаюсь обновить свой контроль формы с помощью вызова ajax, MVC не имеет никакого способа узнать, что они будут помещены внутри элемента формы, и поэтому он не испускает для них никакой логики проверки.

+0

Имеет смысл, что редактор «испускает» ошибки проверки и т. Д., И что нет представления. Можем ли мы увидеть код для вашего вида? – rfmodulator

+0

Проблема заключается в том, что MVC вставляет проверку валидации только в том случае, если обнаруживает, что элементы управления находятся внутри формы. Проблема в том, что я хочу добавить разметку в элемент управления формы через ajax-обновление, но таким образом MVC-движок не знает, что эта разметка будет вставлена ​​в элемент формы и, следовательно, не будет выпускать какую-либо разметку проверки. – Zoliqa

+0

Вы можете заставить его использовать некоторый код Html.ValidationMessageFor(). Как я уже сказал, покажите нам свое мнение. – rfmodulator

ответ

1

Вы включили ненавязчивую проверку в web.config или самом представлении?

в web.config:

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

или внутри кода:

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

Его проверка корректно работает в редакторе, поэтому это говорит о правильности конфигурации. – rfmodulator

2

В вашем частичным видом, добавьте (C#/Razor):

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

Использование проверки клиента , можно повторно проверить элементы, загруженные после загрузки страницы. Поскольку MVC теперь использует проверку jQuery, если вы включили проверку клиента;

jquery validate - validating a field on pageload

Это может помочь вам.

10

Put это в верхней части частичный вид, и вы получите сообщение проверки вынесенное в выходной HTML:

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

Если вы используете Ajax для добавления полей формы вы можете вызвать новые поля в добавляются к проверке после того, как они были добавлены к DOM/Страница используя что-то вроде:

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

EDIT/UPDATE (23 Fed 2013): Я только взломал FormContext частичного зрения для первый раз в Visual Studio 2012, и кажется, что с последними версиями jQuery и Validation и т. д. Мне не нужно добавлять 3 строки javascript (вверху) для проверки работоспособности динамически над ajax, что отлично!

+0

Это сработало, но я не уверен, что понимаю почему. –

+0

@ ChrisJackson - хорошо, рассматривая проблему исключительно с точки зрения высокоуровневого черного ящика, было бы справедливо сказать, что Html.ValidationMessageFor ищет ненулевой FormContext, который обычно настраивается с использованием чего-то вроде использования (Html.BeginForm) {- и если он не находит его, он не мешает визуализации сообщений проверки. Я предполагаю, что для проверки правильности JS требуется форма для правильной работы, поэтому нет сообщений о проверке. ИМО - это надзор со стороны команды .Net. – Rob

+1

@ Rob, спасибо, это излечило мою головную боль! – Netricity

2

Не уверен, если это все-таки для вас проблемой, но решение было бы назвать:

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

после того, как вы загрузили форму разметки/управления с помощью AJAX. Это анализирует ваши новые элементы формы и создает клиентскую проверку, указанную вами в вашем представлении.

+0

Независимо от того, было ли это проблемой для него, это было проблемой для меня. Я подпрыгивал по глубине межвебца, весь этот безумный день искал это, зная, что это будет что-то вроде повторного применения валидации. Мое единственное сожаление в том, что у меня есть только одно преимущество. Благодарю вас, добрый сэр, так как теперь я могу прекратить спринтерскую голову сначала в эту кирпичную стену, окрашенную множеством пинтов моей крови. О, я не сказал $ ('# my-new-form-div'), я сказал $ ('form'), и он все еще работал. FYI. – vbullinger