asp.net mvc 中使用日期控件(My97DatePicker)(一)

      asp.net mvc 开发模式虽好,但是总感觉微软对视图view层面的支持不到位,例如连个像样的日期js控件都没有,无奈只能自己找资料研究扩展HtmlHelper来实现。本篇文章使用My97DatePicker日期控件来实现。

    My97DatePicker 的下载地址:点击打开链接

 

  1. 创建asp.net mvc 项目      
  2. 编写实体类
  3. 扩展htmlHelper
  4. 生成view页面

 

 

  • 创建asp.net mvc 项目

 

           打开vs 点击创建asp.net mvc 网站创建一个DataPicker的网站项目,不选择单元测试

           

           

  • 编写实体类
    编写业务实体类,这里就编写个User类吧,也不实现与数据库的映射,注意引用命名空间 using System.ComponentModel
           
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;

namespace DataPicker.Models
{
    public class User
    {
        [DisplayName("姓名")]  
        public string Name { get; set; }

        [DisplayName("年龄")]
        public UInt16 Age { get; set; }

        [DisplayName("生日")]
        public DateTime Birthday { get; set; }
    }
}
  1. 扩展htmlHelper
         在项目中建立My97DatePicker 文件夹将下载好的My97DatePicker js 包解压缩后引入项目中
      
        在项目中建立一个WebExtend的文件夹用于存放将My97DatePicker日期控件扩展HtmlHelper类代码。
         
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Linq.Expressions;

namespace System.Web.Mvc
{

    /// <summary>
    /// HtmlHelper for My97DatePicker
    /// </summary>
    public static class My97DatePicker
    {
        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+"\"  onclick=\"WdatePicker({el:'"+name+"'})\" class=\"Wdate\" value=\"" + date.Value.ToString(format) + "\" />";
            }
            else
            {
                return "<input type=\"text\" id=\"" + name + "\"  onclick=\"WdatePicker({el:'" + name + "'})\" class=\"Wdate\" value=\"\" />";
            }
        }
    }

}
       如果需要使用日期控件其它样式或功能,请参考http://www.my97.net/dp/demo/index.htm功能与实例扩展以上代码中的GenerateHtml方法和CalendarDisplayFor方法。
  1. 生成View页面
         在生成User的Create页面之前,我们需要在模板页面(Site.Master)中引入My97DatePicker的css和js脚本。
        
    <link href="../../My97DatePicker/skin/WdatePicker.css" rel="stylesheet" type="text/css" />
    <script src="../../My97DatePicker/calendar.js" type="text/javascript"></script>
    <script src="../../My97DatePicker/WdatePicker.js" type="text/javascript"></script>
      生成User的控制器UserController
    
public class UserController : Controller
    {
        //
        // GET: /User/

        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: /User/Details/5

        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /User/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /User/Create

        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
        
        //
        // GET: /User/Edit/5
 
        public ActionResult Edit(int id)
        {
            return View();
        }

        //
        // POST: /User/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add update logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /User/Delete/5
 
        public ActionResult Delete(int id)
        {
            return View();
        }

        //
        // POST: /User/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here
 
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
 再生成User的Create页面,选择强类型User,如果没有类型,请重新生成一下项目。
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DataPicker.Models.User>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
	Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <% using (Html.BeginForm()) {%>
        <%= Html.ValidationSummary(true) %>

        <fieldset>
            <legend>Fields</legend>
            
            <div class="editor-label">
                <%= Html.LabelFor(model => model.Name) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Name) %>
                <%= Html.ValidationMessageFor(model => model.Name) %>
            </div>
            
            <div class="editor-label">
                <%= Html.LabelFor(model => model.Age) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Age) %>
                <%= Html.ValidationMessageFor(model => model.Age) %>
            </div>
            
            <div class="editor-label">
                <%= Html.LabelFor(model => model.Birthday) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Birthday) %>
                <%= Html.ValidationMessageFor(model => model.Birthday) %>
            </div>
            
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%= Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>
将其中生日日期的相关html代码修改一下,即
<div class="editor-label">
                <%= Html.LabelFor(model => model.Birthday) %>
            </div>
            <div class="editor-field">
                <%= Html.TextBoxFor(model => model.Birthday) %>
                <%= Html.ValidationMessageFor(model => model.Birthday) %>
            </div>
修改为:
  <div class="editor-label">
                <%: Html.LabelFor(model => model.Birthday)%>
            </div>
            <div class="editor-field">
                <%= Html.CalendarFor(model => model.Birthday)%>
                <%: Html.ValidationMessageFor(model => model.Birthday)%>
            </div>

最后我们将路由修改为启动网站后直接显示到以上的Create 试图页面中,将Global.asax中路由修改为以下代码:
routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "User", action = "Create", id = UrlParameter.Optional } // 参数默认值
            );

按F5启动网站,如果配置没问题的话回弹出如下界面,我们可以选择日期选择框来选择日期
 
 
 
可能存在的问题:
   如果出现提示如下图片,你需要将项目的框架选择为.net 4,在项目属性中进行设置。
  
 
  结语:通过这个简单的例子我们学习了如何为asp.net mvc 进行扩展日期选择框的htmlHelper,同理我们也可以将其它复杂的js控件来进行包装扩展。
  我使用的是nhibernate来作为数据存取层,比较有趣的是在保存的时候Html.ValidationMessageFor 会自动将nh中不能为空的属性进行非空提醒。
 
如果您觉得我的文章对您有所帮助,欢迎扫码进行赞赏!
 
    


 

 
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 在ASP.NETDatePicker控件是一种用于在Web应用程序选择日期控件。它是一种基于浏览器的日期选择工具,允许用户从一个可视化的日历选择日期DatePicker控件具有多种特性,可以根据需要进行配置。首先,可以设置控件日期格式,如yyyy/mm/dd或mm/dd/yyyy等。其次,可以设置最小日期和最大日期,以限制用户选择的日期范围。还可以设置日期的默认值,从而为用户提供一个预选的日期。此外,DatePicker控件还支持本地化,可以根据不同的区域设置显示日期的语言和格式。 在ASP.NET,可以通过以下步骤使用DatePicker控件。首先,在页面上添加一个DatePicker控件,可以使用ASP.NET的工具箱或手动编写代码来完成。然后,在控件的属性进行设置,如日期格式、最小日期、最大日期等。接下来,可以在代码获取用户选择的日期,并将其用于进一步的处理,如保存到数据库、执行计算或显示在页面上。 在使用DatePicker控件时,还需要注意一些事项。首先,要确保在页面引入DatePicker的脚本文件,以便控件能够正常工作。其次,在用户输入日期时,需要进行有效性验证,以确保输入的日期格式正确。此外,还可以通过CSS对DatePicker进行样式调整,以适应不同的设计风格。 总体而言,在ASP.NETDatePicker控件是一个方便易用的工具,可以简化日期选择的过程,并提供了许多定制和配置的选项,以满足不同的需求。它可以用于各种Web应用程序,如预约系统、任务管理系统等,提供更好的用户体验和功能性。 ### 回答2: 在ASP.NETDatePicker控件是用于日期选择的一个常见控件。它是基于jQuery UI的DatePicker控件定制而来的一种服务器端控件。 在ASP.NET使用DatePicker控件可以简化日期选择的过程。通过在页面添加DatePicker控件,用户可以通过点击文本框弹出一个日历选择器,然后从日历选择一个日期,这个选择的日期将会自动填充到文本框DatePicker控件可以方便地在日期控件和文本框之间进行数据交互,并且提供了丰富的选项来自定义日期选择器的外观和行为。 在ASP.NET页面使用DatePicker控件,首先需要引入相应的JavaScript和CSS文件,这些文件通常是通过NuGet包管理器安装的。然后,在页面的代码部分,我们可以通过定义一个TextBox控件,并在其属性指定DatePicker控件类型,来创建和配置一个DatePicker控件使用DatePicker控件还可以通过设置其属性来控制日期选择范围、日期格式、默认选日期、禁用某些特定日期等。除了基本的日期选择功能外,DatePicker控件还可以与其他服务器端控件配合使用,例如可以在选日期后自动提交表单、根据选择的日期显示相关数据等等。 总的来说,ASP.NETDatePicker控件提供了一种简单而有效的日期选择解决方案,可以帮助开发者实现日期选择功能并提升用户体验。 ### 回答3: DatePicker控件ASP.NET的一种常用控件,用于在Web应用程序显示和选择日期。它可以帮助用户方便地从一个可视化的日历选择一个日期DatePicker控件具有以下特点: 1. 简单易用:DatePicker控件使用起来非常简单,只需要将它添加到网页的表单即可。它提供了一个可视化的日历界面,用户可以直接在日历点击选择日期。 2. 样式可定制化:DatePicker控件支持自定义样式,可以根据需求调整其外观和布局。用户可以设置日期文本框的外观、日历的大小和样式等。 3. 日期范围选择:DatePicker控件可以限制可选择的日期范围,用户只能在指定的日期范围内选择日期。这有助于防止用户选择无效的日期。 4. 时间格式设置:DatePicker控件支持不同的时间格式,可以根据需要设置日期和时间的显示格式。用户可以选择显示年、月、日,还是显示时、分、秒,以及日期的顺序等。 5. 日期格式验证:DatePicker控件内置了日期格式验证功能,用户输入的日期格式不正确时,会自动给出错误提示,防止用户输入无效的日期。 6. 服务器端和客户端事件:DatePicker控件可以触发服务器端和客户端的事件。用户可以在选择日期后执行特定的操作,比如保存选择的日期、执行日期计算等。 总之,DatePicker控件ASP.NET一个非常便捷和实用的日期选择控件。它可以帮助用户方便地选择和输入日期,提高用户体验,并且具有灵活的样式和验证功能。在开发Web应用程序时,可以考虑使用DatePicker控件来提供日期选择功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨4点5杀老大爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值