ASP.NET MVC PartialView не генерирует проверочную разметку - PullRequest
8 голосов
/ 22 декабря 2011

Я создал частичное представление в приложении MVC 3. Это представление имеет строго типизированную модель, подобную этой:

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 не может знать, что они будут помещены в элемент формы, и поэтому, я полагаю, не выдает для них никакой логики проверки.

Ответы [ 5 ]

10 голосов
/ 24 января 2012

Поместите это в верхнюю часть вашего частичного представления, и вы получите сообщение проверки, отображаемое в выводе 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, и это здорово!

2 голосов
/ 20 февраля 2012

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

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

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

2 голосов
/ 22 декабря 2011

Добавьте в свой частичный вид (C # / Razor):

@Html.ValidationMessageFor(model => model.ProductPrice)
1 голос
/ 22 декабря 2011

Вы включили ненавязчивую проверку в 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 голосов
/ 22 декабря 2011

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

Проверка JQuery - проверка поля при загрузке страницы

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

...