Usando XVAL e um ViewModel
-
20-09-2019 - |
Pergunta
Eu vi um post semelhante que estava tentando fazer a mesma coisa com o exemplo do jantar, mas ele consertou seu problema que a minha parece ser um pouco mais profunda. Basicamente, eu tenho que a validação funcione bem, mas só funciona no Firefox. No IE7, quando a página carrega, eu imediatamente recebo uma caixa de alerta com a seguinte mensagem: "Erro: o título do elemento não está em um formulário" ... claramente está em forma aqui, se necessário, posso postar a marcação que realmente é renderizada da fonte de visualização para mostrar isso. Quaisquer idéias sobre o que posso fazer para consertar isso seriam mais apreciadas!
Basicamente, estou apenas tentando garantir que meu jornal tenha um título e um corpo. Desde que eu o envolvi no ViewModel, acho que o IE não entende muito isso. Talvez eu esteja errado.
Estou usando o XVAL para minha validação. Estou passando um viewmodel como meu modelo. Meu viewmodel se parece com o seguinte:
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;
}
}
Aqui está a minha opinião:
<%@ 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>()%>
E finalmente minha ação post:
[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();
}
}
Solução
Eu encontrei o problema semelhante ao que você tem. Honestamente, não parece que você fez a bagunça como eu, mas talvez isso o direcione para a solução.
O formulário de entrada da mina com a validação do cliente XVAL foi carregado dinamicamente (chamada JQuery Ajax) na página. Infelizmente, esqueci que estava colocando o HTML devolvido no elemento que já tem 'forma' entre os elementos dos pais. Por ser uma solicitação de Ajax, os elementos de 'formulário' aninhados na página e o método XVAL "_ATTACHRULETODOMELEMENT" é implementado desta maneira:
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");
Mine Parentform.lengts era 2!
Vejo que você não tem uma forma aninhada aqui, com certeza, mas talvez na Página Master haja algo? Pode ser que o IE7 apresente formas aninhadas e o Firefox não. Além disso, eu nomearia os controles de entrada de maneira diferente, embora essa não deva ser a fonte do problema:
<%= Html.TextBox("np.Title") %>...<%= Html.TextBox("np.Body") %> etc...
E então eu definiria o ElementPrefix também:
<%= Html.ClientSideValidation<NewsPost>("np")%>