Использование xVal и ViewModel
-
20-09-2019 - |
Вопрос
Я видел аналогичный пост, в котором пытались сделать то же самое с примером с ужином, но он исправил свою проблему, моя, кажется, немного глубже.По сути, я могу заставить проверку работать нормально, но она работает только в Firefox.В IE7 при загрузке страницы я сразу получаю окно предупреждения со следующим сообщением:"Ошибка:Заголовок элемента не в форме"...Очевидно, что это здесь в форме. Если необходимо, я могу опубликовать разметку, которая фактически отображается из источника представления, чтобы показать это.Буду очень признателен за любые идеи о том, что я могу сделать, чтобы это исправить!
По сути, я просто пытаюсь убедиться, что у моего NewsPost есть заголовок и тело.Поскольку я включил это в ViewModel, я думаю, что IE не совсем это понимает.Возможно, я ошибаюсь.
Я использую xVal для проверки.Я передаю ViewModel в качестве своей модели.Моя ViewModel выглядит так:
public class NewsAdminViewData : ViewModel
{
public NewsPost NewsPost { get; set; }
public List<SelectListItem> NewsItem { get; set; }
public List<SelectListItem> NewsGroup { get; set; }
public NewsAdminViewData(List<SelectListItem> newsItem, List<SelectListItem> newsGroup, NewsPost newsPost)
{
this.NewsItem = newsItem;
this.NewsGroup = newsGroup;
this.NewsPost = newsPost;
}
}
Вот мой взгляд:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MVCApp.Models.ViewModels.News.NewsAdminViewData>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm())
{%>
<div class="moduleContainer">
<div class="moduleTitle">
Create News Item
</div>
<div class="moduleContent">
<div>
<div>
Title:</div>
<div>
<%= Html.TextBox("Title") %>
</div>
</div>
<div>
<div>
</div>
<div>
<%= Html.TextArea("Body") %>
</div>
</div>
<div>
<div>
News Group:
</div>
<div>
<%= Html.DropDownList("NewsGroup")%>
</div>
</div>
<div>
<div>
News Item:
</div>
<div>
<%= Html.DropDownList("NewsItem") %>
</div>
</div>
</div>
<div class="moduleFooter">
<%= Html.SubmitButton("btnSubmit", "Add News Post", null, "To add this news post click here.", "#ffd40f")%>
</div>
</div>
<% } %>
<%= Html.ClientSideValidation<NewsPost>()%>
И, наконец, мое действие после публикации:
[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult Create(/*FormCollection collection*/ NewsPost np)
{
NewsPost entity = this.reposNewsPost.New();
try
{
entity.Title = np.Title;
entity.NewsPostGUID = System.Guid.NewGuid();
entity.DateAdded = DateTime.Now;
entity.DateUpdated = DateTime.Now;
entity.Body = np.Body;
UpdateModel(entity);
this.reposNewsPost.Insert(entity);
this.reposNewsPost.SubmitChanges();
return RedirectToAction("Index");
}
catch (RulesException ex)
{
ex.AddModelStateErrors(ModelState, "NewsPost");
return ModelState.IsValid ? RedirectToAction(MVC.News.Actions.Create)
: (ActionResult)View();
}
}
Решение
Я столкнулся с такой же проблемой, как и вы.Честно говоря, не похоже, что вы напутали так, как я, но, возможно, это направит вас к решению.
Моя форма ввода с проверкой клиента xVal была загружена динамически (вызов jquery ajax) на страницу.К сожалению, я упустил из виду, что помещаю возвращенный HTML-код в элемент, который уже имеет «форму» между родительскими элементами.Поскольку это был запрос ajax, на странице присутствовали вложенные элементы формы, а метод xVal «_attachRuleToDOMElement» реализован следующим образом:
var parentForm = element.parents("form");
if (parentForm.length != 1)// <-- there can be only one parent form of course
alert("Error: Element " + element.attr("id") + " is not in a form");
Мой родительскийФорм.длины был 2!
Я вижу, что у вас здесь точно нет вложенной формы, но, может быть, на главной странице что-то есть?Возможно, IE7 отображает вложенные формы, а Firefox — нет.Кроме того, я бы назвал элементы управления вводом по-другому, хотя это не должно быть источником проблемы:
<%= Html.TextBox("np.Title") %>...<%= Html.TextBox("np.Body") %> etc...
и тогда я бы тоже установил elementPrefix:
<%= Html.ClientSideValidation<NewsPost>("np")%>