Использование xVal и ViewModel - PullRequest
       16

Использование xVal и ViewModel

1 голос
/ 07 октября 2009

Я видел похожий пост, который пытался сделать то же самое с примером Dinner, но он исправил свою проблему, моя, кажется, немного глубже. По сути, я получаю, чтобы проверка работала нормально, но она работает только в 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>
                        &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>()%>

И, наконец, мое почтовое действие:

 [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();
        }
     }

1 Ответ

1 голос
/ 21 октября 2009

Я столкнулся с той же проблемой, что и вы. Честно говоря, не похоже, что вы устроили беспорядок, как у меня, но, возможно, это направит вас к решению.

Моя форма ввода с проверкой клиента xVal была загружена динамически (вызов jquery ajax) на страницу. К сожалению, я упустил из виду, что я помещаю возвращенный HTML в элемент, который уже имеет «форму» между родительскими элементами. Поскольку это был ajax-запрос, вложенные элементы form присутствуют на странице, а метод 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");

Моего parentForm.lengts было 2!

Я вижу, что у вас наверняка нет вложенной формы, но, возможно, в главной странице есть что-то? Возможно, IE7 отображает вложенные формы, а Firefox - нет. Кроме того, я бы назвал элементы управления вводом по-другому, хотя это не должно быть источником проблемы:

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

и тогда я бы тоже установил elementPrefix:

<%= Html.ClientSideValidation<NewsPost>("np")%>
...