Domanda

ho visto un post simile che stava cercando di fare la stessa cosa con l'esempio cena, ma ha risolto sua miniera problema sembra essere un po 'più profonda. Fondamentalmente ho CXAN ottenere la convalida funzionare bene ma funziona solo in Firefox. In IE7 al caricamento della pagina, immediatamente ottengo una finestra di avviso con il seguente messaggio: "Errore: Element titolo non è in forma" ... Chiaramente è in forma qui, in caso di necessità posso postare il markup che viene effettivamente eseguito il rendering dalla sorgente al fine di mostrare questo. Tutte le idee su che cosa posso fare per risolvere questo problema sarebbero apprezzate!

In pratica sto solo cercando di assicurarsi che il mio NewsPost ha un titolo e un corpo. Dal momento che l'ho avvolto nel ViewModel sto pensando IE pretende molto ben capito questo. Forse mi sbaglio.

Sto usando xVal per la mia convalida. Sto passando un ViewModel come il mio modello. Il mio ViewModel si presenta così:

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;
   }
}

Ecco la mia vista:

<%@ 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>
                        &nbsp;</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 infine il mio post di azione:

 [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();
        }
     }
È stato utile?

Soluzione

Ho incontrato lo stesso problema come si deve. Onestamente, non sembra come hai fatto il casino come ho fatto io, ma forse si dirigerà alla soluzione.

Il mio modulo di input con la convalida del client xVal è stato caricato in modo dinamico (jquery ajax chiamata) nella pagina. Purtroppo, ho trascurato che stavo mettendo la html tornato in l'elemento che ha gia 'forma' tra gli elementi genitori. Perché era una richiesta AJAX, gli elementi 'forma' annidati ove presente sulla pagina, e il metodo xVal "_attachRuleToDOMElement" è implementato in questo modo:

 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");

La mia parentForm.lengts era 2!

vedo che non avete annidato modulo qui di sicuro, ma forse in pagina master c'è qualcosa? Potrebbe essere che IE7 rende forme annidate e Firefox non lo fa. Inoltre, vorrei nomino i controlli di input in modo diverso, anche se questo non dovrebbe essere la fonte del problema:

<%= Html.TextBox("np.Title") %>...<%= Html.TextBox("np.Body") %> etc...

e quindi vorrei impostare elementPrefix troppo:

<%= Html.ClientSideValidation<NewsPost>("np")%>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top