MVC 3 проверка на стороне клиента при сборе с аннотациями данных - не работает - PullRequest
1 голос
/ 09 марта 2011

Я пытаюсь заставить клиентскую проверку работать на моей модели - пока она не работает.

У моей модели есть свойство, которое является коллекцией:

public class NewsEventsModel
{
    public List<NewsItemDetails> newsItems { get; set; }
    public int pageNumber { get; set; }
    public int totalPages { get; set; }
    public bool canManageNews { get; set; }
    public long userID { get; set; }
}

и NewsItemDetailsопределяется следующим образом:

public class NewsItemDetails
{
    public long itemID { get; set; }

    public long postedByID { get; set; }

    public DateTime datePosted { get; set; }

    [Required(ErrorMessage = "Please enter news or event text")]
    [StringLength(100)]
    [RegularExpression(RegExpressions.freeTextRestrict)]
    public string newsBody { get; set; }

    [StringLength(50)]
    [RegularExpression(RegExpressions.freeTextRestrict)]
    public string newsTitle { get; set; }
}

Я отправляю NewsEventsModel для просмотра.Затем, на мой взгляд, я включаю

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>  

Затем в коде представления у меня есть

   for (int j = 0; j < Model.newsItems.Count(); j++)
   {

      /// bunch of stuff
      // then:
     <div class="editblock">
       @Html.TextAreaFor(model => model.newsItems[j].newsBody, new { @class = "formtextem", id = editBoxID, rows = "10", style = "width: 54em" })
       @Html.ValidationMessageFor(model => model.newsItems[j].newsBody)
     </div> 
   } 

Но когда я удаляю весь текст в текстовой области и нажимаю "Сохранить", "требуется"сообщение не появляется .. и никакие сообщения не появляются, когда я нарушаю любое из других правил.

Однако проверка на стороне клиента работает, если я добавляю аннотацию проверки на одно из свойств на верхнем уровнеNewsEventsModel, а затем включить его в виде текстового поля в представлении.Это просто не работает для низкоуровневого класса NewsItemDetails.

Что мне здесь не хватает?

1 Ответ

3 голосов
/ 09 марта 2011

Попробуйте использовать шаблоны редактора в своем представлении:

@Html.EditorFor(x => x.newsItems)

и внутри ~/Views/Shared/EditorTemplates/NewsItemDetails.cshtml:

@model AppName.Models.NewsItemDetails

// bunch of stuff
// then:
<div class="editblock">
    @Html.TextAreaFor(model => model.newsBody, new { @class = "formtextem", id = editBoxID, rows = "10", style = "width: 54em" })
    @Html.ValidationMessageFor(model => model.newsBody)
</div> 
...