none
asp.net mvc 3扩展HtmlHelper,想添加Calendar 出错 RRS feed

  • 问题

  • 我在学习如何自定义一个日期控件,网上找到如下代码,但实际运行时却报错,而我查看了源代码,并没有发现错误,不知怎么解决?我用的是asp.net mvc3, vs2010

    using System;
    using System.Collections.Generic;
    using System.Runtime.CompilerServices;
    using System.Linq.Expressions;
      
    namespace System.Web.Mvc
    {
        /// <summary>
        /// Extended the HtmlHelper for Calendar
        /// </summary>
        public static class CalendarExtensions
        {
            private static string defaultFormat = "yyyy-MM-dd";
      
            /// <summary>
            /// 使用特定的名称生成控件
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="name">控件名称</param>
            /// <returns>Html文本</returns>
            public static string Calendar(this HtmlHelper helper, string name)
            {
                return Calendar(helper, name, defaultFormat);
            }
      
            /// <summary>
            /// 使用特定的名称生成控件
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="name">控件名称</param>
            /// <param name="format">显示格式</param>
            /// <returns>Html文本</returns>
            public static string Calendar(this HtmlHelper helper, string name, string format)
            {
                return GenerateHtml(name, null, format);
            }
      
            /// <summary>
            /// 使用特定的名称和初始值生成控件
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="name">控件名称</param>
            /// <param name="date">要显示的日期时间</param>
            /// <returns>Html文本</returns>
            public static string Calendar(this HtmlHelper helper, string name, DateTime date)
            {
                return Calendar(helper, name, date, defaultFormat);
            }
      
            /// <summary>
            /// 使用特定的名称和初始值生成控件
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="name">控件名称</param>
            /// <param name="date">要显示的日期时间</param>
            /// <param name="format">显示格式</param>
            /// <returns>Html文本</returns>
            public static string Calendar(this HtmlHelper helper, string name, DateTime date, string format)
            {
                return GenerateHtml(name, date, format);
            }
      
            /// <summary>
            /// 通过lambda表达式生成控件
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="expression">lambda表达式,指定要显示的属性及其所属对象</param>
            /// <returns>Html文本</returns>
            public static string CalendarFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
            {
                return CalendarFor(helper, expression, defaultFormat);
            }
      
            /// <summary>
            /// 通过lambda表达式生成控件
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="expression">lambda表达式,指定要显示的属性及其所属对象</param>
            /// <param name="format">显示格式</param>
            /// <returns>Html文本</returns>
            public static string CalendarFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string format)
            {
                string name = ExpressionHelper.GetExpressionText(expression);
                DateTime value;
      
                object data = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, helper.ViewData).Model;
                if(data != null&& DateTime.TryParse(data.ToString(), out value))
                {
                    return GenerateHtml(name, value, format);
                }
                else
                {
                    return GenerateHtml(name, null, format);
                }
            }
      
            /// <summary>
            /// 通过lambda表达式获取要显示的日期时间
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="expression">lambda表达式,指定要显示的属性及其所属对象</param>
            /// <param name="format">显示格式</param>
            /// <returns>Html文本</returns>
            public static string CalendarDisplayFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string format)
            {
                string name = ExpressionHelper.GetExpressionText(expression);
                DateTime value;
      
                object data = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, helper.ViewData).Model;
                if(data != null&& DateTime.TryParse(data.ToString(), out value))
                {
                    return value.ToString(format);
                }
                else
                {
                    return String.Empty;
                }
            }
      
            /// <summary>
            /// 通过lambda表达式获取要显示的日期时间
            /// </summary>
            /// <param name="helper">HtmlHelper对象</param>
            /// <param name="expression">lambda表达式,指定要显示的属性及其所属对象</param>
            /// <returns>Html文本</returns>
            public static string CalendarDisplayFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
            {
                return CalendarDisplayFor(helper, expression, defaultFormat);
            }
      
            /// <summary>
            /// 生成输入框的Html
            /// </summary>
            /// <param name="name">calendar的名称</param>
            /// <param name="date">calendar的值</param>
            /// <returns>html文本</returns>
            private static string GenerateHtml(string name, DateTime? date, string format)
            {
                if(date != null)
                {
                    return "<input type=\"text\" id=\""+ name + "\" name=\""+ name + "\" onfocus=\"WdatePicker({dateFmt:'"+ format + "'})\" class=\"Wdate\" value=\""+ date.Value.ToString(format) + "\" />";
                }
                else
                {
                    return"<input type=\"text\" id=\""+ name + "\" name=\""+ name + "\" onfocus=\"WdatePicker({dateFmt:'"+ format + "'})\" class=\"Wdate\" value=\"\" />";
                }
            }
        }
    }
    

    调用

    @Html.Calendar("calStartDate", (DateTime)ViewData["_StartDate"])
    

    错误

    Compiler Error Message: CS0121: The call is ambiguous between the following methods or properties: 'System.Web.Mvc.CalendarExtensions.Calendar(System.Web.Mvc.HtmlHelper, string, System.DateTime)' and 'System.Web.Mvc.CalendarExtensions.Calendar(System.Web.Mvc.HtmlHelper, string, System.DateTime)'

    2012年5月24日 5:42

答案

全部回复

  • 你可以先把

    public static string Calendar(this HtmlHelper helper, string name, string format)

    这个方法删除 试试!

    2012年5月24日 9:55
    版主
  • 试过了,还是不行
    2012年5月25日 7:35
  • 你把方法精简成一个先试试  如果OK的话 在一步一步的加上去...

    看看到底是哪里出现问题了! 

    2012年5月25日 7:47
    版主
  • 我去掉只剩下CalendarFor 和 GenerateHtml,不会报错了,但会显示如下html语句而不是现实控件。

    我调用的是  @Html.CalendarFor(m=>m.StartDate)

    但结果是

    <input type="text" id="StartDate" name="StartDate" onfocus="WdatePicker({dateFmt:'yyyy-MM-dd'})" class="Wdate" value="2012-05-18" />

    MVC3 应该如何调用呢?

    2012年5月25日 14:34
  • 再添加一个@Html.Raw(@Html.CalendarFor(m=>m.StartDate)) 就好了
    • 已标记为答案 Richard_Wu 2012年5月25日 15:00
    2012年5月25日 15:00