【问题标题】:MVC Html.ValidationMessageFor is not firing in a partial viewMVC Html.ValidationMessageFor 未在部分视图中触发
【发布时间】:2011-05-08 14:15:54
【问题描述】:

Html.LabelFor 工作正常,那么为什么不是 Html.ValidationMessageFor? 我的局部视图看起来像;

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SHP.WebUI.Models.OtherLeaveViewModel>" %>
<% var unique = DateTime.Now.Ticks.ToString(); %>
<script language="javascript" type="text/javascript">
    $(document).ready(function () {
        $('#EmployeeOtherLeave_OtherLeaveDate').datepicker({ dateFormat: 'dd-MM-yy' });
        $('#MorningOnlyFlag').click(function () {
            $('#AfternoonOnlyFlag').attr('checked', false);
        })
        $('#AfternoonOnlyFlag').click(function () {
            $('#MorningOnlyFlag').attr('checked', false);
        })
    });

    var options = {
        target: '#frmAddAbsenceOneDay<%= unique %>',
        success: RefershList
    };

    $(document).ready(function () {
        $('#frmAddAbsenceOneDay<%= unique %>').ajaxForm(options);
    });

</script>

<div id="AddAbsenceOnDay<%= unique %>">
    <% using (Html.BeginForm("AddAbsenceOneDay", "Employee", FormMethod.Post,
           new { id = "frmAddAbsenceOneDay" + unique }))
       { %>
        <%: Html.ValidationSummary(true) %>
        <fieldset>
            <legend>Add an absence for a day or half day</legend>
            <table>
                <tr>
                    <td><%: Html.LabelFor(model => model.EmployeeOtherLeave.OtherLeaveId)%></td>
                    <td>
                <%: Html.DropDownListFor(model => model.EmployeeOtherLeave.OtherLeaveId, Model.LeaveList, "<--Select-->")%>
                <%: Html.ValidationMessageFor(model => model.EmployeeOtherLeave.OtherLeaveId)%>                    
                    </td>
                </tr>
                <tr>
                    <td>
                <%: Html.LabelFor(model => model.EmployeeOtherLeave.OtherLeaveDate)%>                    
                    </td>
                    <td>
                <%: Html.EditorFor(model => model.EmployeeOtherLeave.OtherLeaveDate)%>
                <%: Html.ValidationMessageFor(model => model.EmployeeOtherLeave.OtherLeaveDate)%>                    
                    </td>
                </tr>
                <tr>
                    <td>
                <%: Html.LabelFor(model => model.EmployeeOtherLeave.MorningOnlyFlag)%>
                    </td>
                    <td>
                <%: Html.CheckBoxFor(model => model.EmployeeOtherLeave.MorningOnlyFlag)%>
                <%: Html.ValidationMessageFor(model => model.EmployeeOtherLeave.MorningOnlyFlag)%>                        
                    </td>
                </tr>
                <tr>
                    <td>
                <%: Html.LabelFor(model => model.EmployeeOtherLeave.AfternoonOnlyFlag)%>
                    </td>
                    <td>
                <%: Html.CheckBoxFor(model => model.EmployeeOtherLeave.AfternoonOnlyFlag)%>
                <%: Html.ValidationMessageFor(model => model.EmployeeOtherLeave.AfternoonOnlyFlag)%>                     
                    </td>
                </tr>
            </table>

            <p>
                <span style="padding-right:10px;"><input type="submit" value="Create" /></span><input type="button" value="Close" onclick="closeTab()" />
            </p>
        </fieldset>
    <% } %>
    </div>

我的好友班长这样;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SHP.WebUI.Utility;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using System.ComponentModel;

namespace SHP.Models
{
    [MetadataType(typeof(EmployeeOtherLeaf.Metadata))]
    public partial class EmployeeOtherLeaf
    {
        public string OtherLeaveName
        {
            get
            {
                if (this.OtherLeaf == null || this.OtherLeaf.OtherLeaveName == null)
                    return string.Empty;
                else
                    return this.OtherLeaf.OtherLeaveName;
            }
        }
        public EmployeeOtherLeaf() { }

        #region static methods

        #region methods

        #region "Buddy class" for validation
        /// <summary>
        /// This "buddy class" provides validation for a class generated from EF
        /// </summary>
        private sealed class Metadata
        {
            [HiddenInput(DisplayValue = false)]
            public int EmployeeOtherLeaveId { get; set; }
            [HiddenInput(DisplayValue = false)]
            public int EmployeeId { get; set; }

            [DisplayName("Leave Type")]
            [UIHint("DropDownList")]
            [Required(ErrorMessage = "Leave Type is required")]
            public int OtherLeaveId { get; set; }

            [DisplayName("Date")]
            [DataType(DataType.Date)]
            [Required(ErrorMessage = "Date is required")]
            public DateTime OtherLeaveDate
            {
                get { return Convert.ToDateTime(this.OtherLeaveDate); }
                set { this.OtherLeaveDate = Convert.ToDateTime(value); }
            }

            [DisplayName("Morning Only")]
            public bool MorningOnlyFlag
            {
                get { return Convert.ToBoolean(this.MorningOnlyFlag); }
                set { this.MorningOnlyFlag = Convert.ToBoolean(value); }
            }

            [DisplayName("Afternoon Only")]
            public bool AfternoonOnlyFlag
            {
                get { return Convert.ToBoolean(this.AfternoonOnlyFlag); }
                set { this.AfternoonOnlyFlag = Convert.ToBoolean(value); }
            }
        }
        #endregion  
    }
}

* 添加信息 * 此后我将模型展平,新视图如下所示;

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SHP.Models.EmployeeOtherLeaf>" %>
<% var unique = DateTime.Now.Ticks.ToString(); %>
<script language="javascript" type="text/javascript">
    $(document).ready(function () {
        $('#EmployeeOtherLeave_OtherLeaveDate').datepicker({ dateFormat: 'dd-MM-yy' });
        $('#MorningOnlyFlag').click(function () {
            $('#AfternoonOnlyFlag').attr('checked', false);
        })
        $('#AfternoonOnlyFlag').click(function () {
            $('#MorningOnlyFlag').attr('checked', false);
        })
    });

    var options = {
        target: '#frmAddAbsenceOneDay<%= unique %>',
        success: RefershList
    };

    $(document).ready(function () {
        $('#frmAddAbsenceOneDay<%= unique %>').ajaxForm(options);
    });

</script>

<div id="AddAbsenceOnDay<%= unique %>">
    <%Html.EnableClientValidation(); %>
    <% using (Html.BeginForm("AddAbsenceOneDay", "Employee", FormMethod.Post,
           new { id = "frmAddAbsenceOneDay" + unique }))
       { %>
        <%: Html.ValidationSummary(true) %>
        <fieldset>
            <legend>Add an absence for a day or half day</legend>
            <table>
                <tr>
                    <td><%: Html.LabelFor(model => model.OtherLeaveId)%></td>
                    <td>
                <%: Html.DropDownListFor(model => model.OtherLeaveId, Model.SelectLeaveTypeList, "<--Select-->")%>
                <%: Html.ValidationMessageFor(model => model.OtherLeaveId)%>                    
                    </td>
                </tr>
                <tr>
                    <td>
                <%: Html.LabelFor(model => model.OtherLeaveDate)%>                    
                    </td>
                    <td>
                <%: Html.EditorFor(model => model.OtherLeaveDate)%>
                <%: Html.ValidationMessageFor(model => model.OtherLeaveDate)%>                    
                    </td>
                </tr>
                <tr>
                    <td>
                <%: Html.LabelFor(model => model.MorningOnlyFlag)%>
                    </td>
                    <td>
                <%: Html.CheckBoxFor(model => model.MorningOnlyFlag)%>
                <%: Html.ValidationMessageFor(model => model.MorningOnlyFlag)%>                        
                    </td>
                </tr>
                <tr>
                    <td>
                <%: Html.LabelFor(model => model.AfternoonOnlyFlag)%>
                    </td>
                    <td>
                <%: Html.CheckBoxFor(model => model.AfternoonOnlyFlag)%>
                <%: Html.ValidationMessageFor(model => model.AfternoonOnlyFlag)%>                     
                    </td>
                </tr>
            </table>

            <p>
                <span style="padding-right:10px;"><input type="submit" value="Create" /></span><input type="button" value="Close" onclick="closeTab()" />
            </p>
        </fieldset>

    <% } %>
    </div>

【问题讨论】:

  • 您是否将其用作控件?这个视图是如何被调用的?

标签: asp.net-mvc


【解决方案1】:

我发现了 Javascript 拼写错误的问题; RefreshList 应该是 RefreshList。我说对了,它有效。

【讨论】:

    【解决方案2】:

    元数据伙伴类与您的常规模型一起使用。您永远不应该真正访问 buddy 类中包含的成员。

     <%: Html.CheckBoxFor(model => model.EmployeeOtherLeave.MorningOnlyFlag)%>
     <%: Html.ValidationMessageFor(model => model.EmployeeOtherLeave.MorningOnlyFlag)%>      
    

    应该是:

     <%: Html.CheckBoxFor(model => model.MorningOnlyFlag)%>
     <%: Html.ValidationMessageFor(model => model.MorningOnlyFlag)%>       
    

    在验证实际模型时发生了什么,ModelState 条目可能包含“MorningOnlyFlag”之类的键。当您将 ValidationMessageFor 与元数据类成员一起使用时,您将请求带有键“EmployeeOtherLeave.MorningOnlyFlag”的 ModelState 条目。


    你这是递归的权利,总是会抛出 Stackoverflow 异常?

    public DateTime OtherLeaveDate
            {
                get { return Convert.ToDateTime(this.OtherLeaveDate); }
                set { this.OtherLeaveDate = Convert.ToDateTime(value); }
            }
    

    您是在任何地方调用 UpdateModel 还是使用 EmployeeOtherLeaf 作为参数作为操作方法? UpdateModel 执行模型验证。

    【讨论】:

    • 我不得不承认这看起来是正确的答案。但是,我将模型展平,验证器仍然没有触发。请参阅上面的新视图。
    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多