MVC Html.ValidationMessageFor未在局部视图中触发

时间:2010-11-11 16:42:32

标签: asp.net-mvc

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>

2 个答案:

答案 0 :(得分:0)

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

 <%: 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执行模型验证。

答案 1 :(得分:0)

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