【问题标题】:Using xVal and a ViewModel使用 xVal 和 ViewModel
【发布时间】:2009-10-07 14:08:12
【问题描述】:

我看到一个类似的帖子试图用晚餐的例子做同样的事情,但他解决了他的问题,我的问题似乎更深一些。基本上我可以让验证正常工作,但它只适用于 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();
        }
     }

【问题讨论】:

  • 顶...有人有什么想法吗???
  • 这个问题真的有问题吗?我认为这对 SO 不起作用。

标签: asp.net-mvc validation xval


【解决方案1】:

我遇到了与您类似的问题。老实说,看起来你不像我那样把事情弄得一团糟,但也许它会引导你找到解决方案。

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

我的 parentForm.lengts 是 2!

我看到您肯定没有嵌套表单,但也许在母版页中有一些东西?可能是 IE7 呈现嵌套表单而 Firefox 没有。 另外,我会以不同的方式命名输入控件,尽管这不应该是问题的根源:

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

然后我也会设置 elementPrefix:

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

【讨论】:

  • 我没有看到你为克服这里的问题所做的确切工作......你做了什么来解决这个问题?
  • 我重新排列了我的 html,所以我没有嵌套的表单元素。 parentForm.length 现在是 1,而不是 2。但是,如果您有嵌套表单,这就是问题的原因,您应该设法避免它。不仅仅是因为这个问题,还因为这不是 W3C 标准的有效 html:w3.org/TR/xhtml1/#prohibitions
  • 因为我把前缀,它工作。它在 IE 中抱怨“标题”不在表单中的原因是因为它正在查看头部的 ,而不是元素 id 的标题值....不确定 IE 为什么这样做但是FF没有。但无论哪种方式,前缀都有效。
猜你喜欢
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多