热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASP.NETMVC3Razor表单还能再直观点

ASP.NETMVC3Razor表单还能再直观点转自http:www.cnblogs.comthink8848archive201109142175432.html转载请注明作者(
ASP.NET MVC 3 Razor 表单还能再直观点

转自http://www.cnblogs.com/think8848/archive/2011/09/14/2175432.html

 

转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)


依照本人惯例,开篇先说些与主题无关的话:本来打算把写博客的这个习惯坚持下去,就算不能出精品,也能出一些水货,对于某些小问题提供点解决方案,
但是今年的8月真可谓是多事之“秋”,很多事情都凑到一起去了,几乎没有时间学习新的东西,更别说去写博客了,9月眼看要过去一半了,昨天才憋出一个小东
西,觉得还稍能滥竽充数下。


 


打算用ASP.NET MVC实现公司的某产品了,昨天遇到一个问题:在异常发生时转回提交前的页面后,原来输入的内容不见了,这可是个大问题,记得以前我在写《ASP.NET MVC异常处理方案》一文时已经解决了这个问题,怎么又看不见提交前的输入了呢,把以前的代码打开后发现了问题所在:


在当前的代码中表单的代码为:



<input id&#61;"txtName" name&#61;"Name" type&#61;"text" />


而之前能出现效果的表单代码为&#xff1a;



&#64;Html.TextBoxFor(x &#61;> x.Name)


稍经测试&#xff0c;就发现&#xff0c;使用Html的扩展方法生成的标签可以获得提交之前的值&#xff0c;但是自已手写的则不行&#xff0c;所以这个
TextBox扩展方法中肯定有某种机制&#xff0c;能自动将值填进标签中。一开始和同事讨论后觉得&#xff0c;使用
&#64;Html.TextBoxFor方法有一个好处&#xff0c;那就是如果更换了Name属性的名称&#xff0c;VS可以自动重构代码&#xff0c;使*.cshtml代码的x.Name自
动更新至新的属性名&#xff0c;经测试后发现原来不是想的这么回事&#xff0c;修改了Name属性的名称&#xff0c;如:PName&#xff0c;使用VS重构代码&#xff0c;发现在视图中属性名居然没有改过
来&#xff1b;而且如果使用Html的扩展方法&#xff0c;似乎也有一些问题&#xff0c;最重要一点就是不直观&#xff0c;在目前的Razor引擎中还不太明显&#xff0c;反正也没有设计器&#xff0c;但是如果以后有
了Razor引擎有了设计器功能&#xff0c;基本可以断定的是&#xff0c;使用&#64;Html.TextBoxFor()的方式很难能做到所见即所得的效果&#xff0c;而且在一个
cshtml页面中&#xff0c;即时不能使用设计器&#xff0c;看代码时如果视图上使用&#64;Html.XXX也不是很直观&#xff0c;既然使用Html扩展方法的方式即不能有利于重构代
码&#xff0c;又不直观&#xff0c;那么使用Html标签的理由似乎就变的充分多了&#xff0c;如果使用这种方法&#xff0c;即使不会C#的人也可以写出来页面。


在这种想法的驱动下&#xff0c;想出一个办法&#xff1a;自已实现一个填充标签值的扩展方法。于是打开ASP.NET MVC
3源代码&#xff0c;看看在这个TextBox内部到底在做些什么&#xff0c;为什么它可以把模型(ViewData.Model)中的值&#xff0c;以及
ViewData.ModelState中的值填充到标签中&#xff0c;一步一步查下来&#xff0c;发现原来实现方法比较简单&#xff0c;直接上代码&#xff1a;



public static class HtmlValueExtension
{
    public static MvcHtmlString Value(this HtmlHelper html, Expression> expression)
    {
        ModelMetadata metadata &#61; ModelMetadata.FromLambdaExpression(expression, html.ViewData);
 
        return Value(html, metadata.PropertyName);
    }
 
    public static MvcHtmlString Value(this HtmlHelper html, string name)
    {
        string attemptedValue &#61; null;
        ModelState modelState;
 
        if (html.ViewData.ModelState.TryGetValue(name, out modelState))
        {
            if (modelState.Value !&#61; null)
            {
                attemptedValue &#61; modelState.Value.ConvertTo(typeof(string), null /* culture */).ToString();
            }
        }
 
        return new MvcHtmlString(attemptedValue ?? Convert.ToString(html.ViewData.Eval(name), CultureInfo.CurrentCulture));
    }
}


定义一个HtmlHelper的扩展方法Value&#xff0c;然后根据
Lambda表达式获取到指定属性的元数据&#xff0c;优先考虑从ModelState中拿出对应的数据&#xff0c;也就是提交前页面表单数据&#xff0c;如果这个数据为null,则尝
试ViewData.Model中指定的数据&#xff0c;很简单吧:)


有了这个类&#xff0c;在页面上使用如下代码调用&#xff1a;



<input id&#61;"txtDeptName" name&#61;"Name" type&#61;"text" value&#61;"&#64;Html.Value(x &#61;> x.Name)"/>


这样&#xff0c;就可以达到与&#64;Html.TextBox()一样的效果了&#xff0c;但是从视图的代码角度来说&#xff0c;直观了不少&#xff0c;而且如果以后Razor引擎有了设计器&#xff0c;估计也可以不用调试也能看到页面效果了。  


最后再友情提示下&#xff0c;如果您在一个Razor的视图中定义了一个表单标签&#xff0c;这个表单标签的值并不对应Model的某个属性&#xff0c;这时如果您想获取提交前的值话&#xff0c;使用Request.Params["TagName"]即可。

posted on 2011-11-18 13:48 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转:https://www.cnblogs.com/lonelyxmas/archive/2011/11/18/2254001.html



推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
author-avatar
kelly最爱梁君诺_795
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有