在MVC中My97date应用C#扩展方法

项目中用的my97date,其他字段是用 @Html.EditorFor(model => model.字段)绑定的,但日历控件是用<input />绑定的,但这样写并不是特别好。

为了也能用@HTML绑定属性,用了扩展方法。代码如下:

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 MvcHtmlString 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 MvcHtmlString 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 MvcHtmlString 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 MvcHtmlString 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 MvcHtmlString 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 MvcHtmlString 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 MvcHtmlString 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 new MvcHtmlString(value.ToString(format)) ;
            }
            else
            {
                return new MvcHtmlString("");

            }

        }

        /// <summary>
        /// 通过lambda表达式获取要显示的日期时间
        /// </summary>
        /// <param name="helper">HtmlHelper对象</param>
        /// <param name="expression">lambda表达式,指定要显示的属性及其所属对象</param>
        /// <returns>Html文本</returns>
        public static MvcHtmlString 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 MvcHtmlString GenerateHtml(string name, DateTime? date, string format)
        {
            string str = "";
            if (date != null)
            {
                str= "<input type=\"text\" id=\"" + name + "\"  onclick=\"WdatePicker({el:‘" + name + "‘})\" class=\"Wdate\" value=\"" + date.Value.ToString(format) + "\" />";
            }
            else
            {
                str= "<input type=\"text\" id=\"" + name + "\"  onclick=\"WdatePicker({el:‘" + name + "‘})\" class=\"Wdate\" value=\"\" />";
            }
            return new MvcHtmlString(str);
        }
    }

只要引用该方法的命名空间,我们就能愉快的使用@Html.CalendarFor等方法。当然还需要引用My97date的JS文件。

时间: 2024-11-05 15:55:37

在MVC中My97date应用C#扩展方法的相关文章

MVC 中输出Html标签的方法

@: item.content 用过ASP.NET MVC的人都知道,这是MVC的基本输出的方式,但是最近我在写一个页面的时候,却碰上了一个问题,我需要在一个div中输出一个<br />标签,然而他却直接把<br />给输了出来,这确实让人很郁闷. 我看了一下代码,原来在输出的时候,这种方式直接把<和>给变换成了<和>,所以我想尽任何编码解码的方式想要把这个给还原出来,然而什么都没有效果. 在不断摸索之后我发现了简单的不能再简单的方法, @(new Html

MVc分页【关于使用扩展方法实现MVc分页】

近期对MVc自定义分页作了一下小研究下面把他记下来 下述代1,2,3里面的代码可以直接拷贝,4以后的根据情况自己选定 1.在后台任写如下的扩展方法(任一类库都可以,但是用时得引用命名空间) // 添加using System.Web; using System.Web.Mvc; 引用,找不到可以从MVC层拷贝 namespace System.Web.Mvc.Html // 注意一定要把类的命名空间写成System.Web.Mvc.Html { public static class PageE

MVC中Model 转ViewModel ConvertAll 方法

应用场景:MVC中 从业务逻辑层得到product 列表后,用viewModel 展示到view中 public class TestController : Controller    {        public ActionResult Index()        {            return View();        } public ActionResult Index()        { //从serviece 得到 product 的list          

C#中的反射和扩展方法的运用

前段时间做了一个练手的小项目,名叫Book_Bar,用来卖书的,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是 RowToClass ,顾名思义,也就是将 DataTable 中的数据封装到 Models 中.结果导致在DAL各个类中写了很多类似的方法,后来就直接把它抽取出来做成了 DataTable和 DataRow的扩展方法, 下面是代码: using System; using System.Collectio

ASP.NET MVC中的模型装配 封装方法 非常好用

我们知道在asp.net mvc中 视图可以绑定一个实体模型 然后我们三层架构中也有一个model模型 但是这两个很多时候却是不一样的对象来的 就拿微软的官方mvc例子来说明 微软的视图实体中 有loginmodel 有registermodel 等等 这些视图模型 都只是占用户实体的某几个字段而已, 那么这个时候 我们可以用下面两个方法来转换 自动赋值两个对象的 protected T AssembleInfo<T, T2>(T2 model)        {            Pro

Unity 中实用的 C# 扩展方法

Unity 内置组件基本没有可以继承的.某些比较常用但现有 API 没有定义的功能,我们可以通过 C# 的扩展类方法来实现(注意一点,扩展方法对于值类型传递的不是引用,所以无法修改原对象.并且传递体积较大的值类型可能造成性能问题).下面是一些比较实用的扩展方法,这些扩展方法的实现很多使用了 C# 的委托,关于委托可以参考这里:C# 中的 delegate, Lambda 和 event. 扩展 Transform 每一个 GameObject 都含有一个 Transform 组件(在 UGUI

MVC中My97date无法进行ValidationMessage修改

上次使用C#扩展方法,对HtmlHelper进行扩展.但是Html.ValidationMessageFor并没有对日期非空验证提示. 查看源码的时候发现对比自己生成的input,多了data-val这些属性.那么只需要在生成input的时候加上该属性即可. var vas = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata); tagBuilder.MergeAttributes(vas); 完整代码如下: public

项目中常用的C# 扩展方法

///我们经常使用一些匿名委托来处理一些逻辑///但是在某些情况下,有可能委托是null,要是直接执行可能会抛异常///所以提供此扩展方法,直接可以使用例如 action.Execute() 来执行 namespace System { public static class ActionExtension { public static void Execute(this Action action) { if (action != null) { action(); } } public s

在ASP.NET MVC中使用jQuery的Load方法加载静态页面的一个注意点

使用使用jQuery的Load方法可以加载静态页面,本篇就在ASP.NET MVC下实现. Model先行: public class Article { public int Id { get; set; } public string Url { get; set; } } 在HomeController中的Index方法,向视图传递一个Article强类型. public class HomeController : Controller { public ActionResult Ind