`
gowithbutton
  • 浏览: 42642 次
社区版块
存档分类
最新评论
阅读更多

     在BPM、OA等系统中,都会存在一个表单设计器。有些是通过操作gridview来完成一个表单的设计;有些是通过类似VS拖拽的方法完成一个表单的设计。很明显后面一种优越于前面一种。无论是哪种,最后都会产生一些XML之类的表单结构的数据。

这篇文章将讲述,在表单设计器设计好表单之后,在ASP.NET MVC中如何将表单结构的xml转换成实际应用系统中的表单。看下面一个xml文件,我们假设它是由一个表单设计器设计出来的。

<span style="color: blue;"><?</span><span style="color: #a31515;">xml </span><span style="color: red;">version</span><span style="color: blue;">=</span>"<span style="color: blue;">1.0</span>" <span style="color: red;">encoding</span><span style="color: blue;">=</span>"<span style="color: blue;">utf-8</span>" <span style="color: blue;">?>
<</span><span style="color: #a31515;">form </span><span style="color: red;">name</span><span style="color: blue;">=</span>"<span style="color: blue;">form1</span>"<span style="color: blue;">>
    <</span><span style="color: #a31515;">field </span><span style="color: red;">type</span><span style="color: blue;">=</span>"<span style="color: blue;">text</span>" <span style="color: red;">name </span><span style="color: blue;">=</span>"<span style="color: blue;">firstname</span>" <span style="color: red;">class </span><span style="color: blue;">=</span>"<span style="color: blue;">textbox</span>" <span style="color: red;">left</span><span style="color: blue;">=</span>"<span style="color: blue;">300</span>"  <span style="color: red;">top</span><span style="color: blue;">=</span>"<span style="color: blue;">200</span>"<span style="color: blue;">></span>朱<span style="color: blue;"></</span><span style="color: #a31515;">field</span><span style="color: blue;">>
    <</span><span style="color: #a31515;">field </span><span style="color: red;">type</span><span style="color: blue;">=</span>"<span style="color: blue;">text</span>" <span style="color: red;">name </span><span style="color: blue;">=</span>"<span style="color: blue;">lastname</span>" <span style="color: red;">class </span><span style="color: blue;">=</span>"<span style="color: blue;">textbox</span>" <span style="color: red;">left</span><span style="color: blue;">=</span>"<span style="color: blue;">700</span>"  <span style="color: red;">top</span><span style="color: blue;">=</span>"<span style="color: blue;">200</span>"<span style="color: blue;">></span>祁林<span style="color: blue;"></</span><span style="color: #a31515;">field</span><span style="color: blue;">>
    <</span><span style="color: #a31515;">field </span><span style="color: red;">type</span><span style="color: blue;">=</span>"<span style="color: blue;">text</span>" <span style="color: red;">name </span><span style="color: blue;">=</span>"<span style="color: blue;">sex</span>" <span style="color: red;">class </span><span style="color: blue;">=</span>"<span style="color: blue;">textbox</span>" <span style="color: red;">left</span><span style="color: blue;">=</span>"<span style="color: blue;">300</span>"  <span style="color: red;">top</span><span style="color: blue;">=</span>"<span style="color: blue;">240</span>"<span style="color: blue;">></span>男<span style="color: blue;"></</span><span style="color: #a31515;">field</span><span style="color: blue;">>
    <</span><span style="color: #a31515;">field </span><span style="color: red;">type</span><span style="color: blue;">=</span>"<span style="color: blue;">text</span>" <span style="color: red;">name </span><span style="color: blue;">=</span>"<span style="color: blue;">age</span>" <span style="color: red;">class </span><span style="color: blue;">=</span>"<span style="color: blue;">textbox</span>" <span style="color: red;">left</span><span style="color: blue;">=</span>"<span style="color: blue;">700</span>"  <span style="color: red;">top</span><span style="color: blue;">=</span>"<span style="color: blue;">240</span>"<span style="color: blue;">></span>24<span style="color: blue;"></</span><span style="color: #a31515;">field</span><span style="color: blue;">>
</</span><span style="color: #a31515;">form</span><span style="color: blue;">>
</span>

<a href="http://11011.net/software/vspaste"></a>

下面,我将把它转化成实际的asp.net mvc系统中的表单。首先,使用LinqtoXML将上面的XML文件转换成XElement,代码如下。在控制器中最好不要直接读取文件,这里为了简单直观起见,就直接在Controller中读取xml文件了。

[<span style="color: #2b91af;">AcceptVerbs</span>(<span style="color: #2b91af;">HttpVerbs</span>.Get)]
<span style="color: blue;">public </span><span style="color: #2b91af;">ActionResult </span>Index()
{
    <span style="color: #2b91af;">XElement </span>xml = <span style="color: #2b91af;">XElement</span>.Load(Server.MapPath(<span style="color: #a31515;">"~/App_Data/form1.xml"</span>));
    ViewData[<span style="color: #a31515;">"xml"</span>] = xml;
    <span style="color: blue;">return </span>View();
}
   接着我们将在View中,将上面的XElement转换成真正的HTML表单。

在表单设计器中很难的一块就是控件的定位。从我提供的XML中可以看到,它里面是存放了位置信息的。这使我们想到了div的绝对布局。这个方法在这种情况下非常的适合。

  下面,我定义两个字符串模板:

<span style="color: blue;">string </span>label = <span style="color: #a31515;">" <div  style=/"left: {0}px; position: absolute; top: {1}px/">{2}</div>"</span>;
<span style="color: blue;">string </span>input = <span style="color: #a31515;">"<input name=/"{0}/" type=/"{1}/"  class=/"{2}/"   style=/"left: {3}px; position: absolute; top: {4}px/" value=/"{5}/"  />"</span>;

<a href="http://11011.net/software/vspaste"></a><span style="font-family: Courier New;"> label用于显示文本信息,input用于显示表单上的value。下面通过循环产生html脚本。</span>

<span style="color: #2b91af;">StringBuilder </span>sb = <span style="color: blue;">new </span><span style="color: #2b91af;">StringBuilder</span>();
sb.Append(<span style="color: #a31515;">"    <div style=/"height:200px/"> "</span>);
<span style="color: blue;">foreach</span>(<span style="color: #2b91af;">XElement </span>f <span style="color: blue;">in </span>xml.Elements()) 
{
  sb.Append(<span style="color: blue;">string</span>.Format(label, <span style="color: blue;">int</span>.Parse(f.Attribute(<span style="color: #a31515;">"left"</span>).Value) - 60, f.Attribute(<span style="color: #a31515;">"top"</span>).Value, f.Attribute(<span style="color: #a31515;">"name"</span>).Value));
  sb.Append(<span style="color: blue;">string</span>.Format(input, f.Attribute(<span style="color: #a31515;">"name"</span>).Value, f.Attribute(<span style="color: #a31515;">"type"</span>).Value, f.Attribute(<span style="color: #a31515;">"class"</span>).Value, f.Attribute(<span style="color: #a31515;">"left"</span>).Value, f.Attribute(<span style="color: #a31515;">"top"</span>).Value, f.Value));
}
sb.Append(<span style="color: #a31515;">"</div > "</span>);

<a href="http://11011.net/software/vspaste"></a><span style="font-family: Courier New;"> 最后通过Response.Write(sb.ToString())输出。</span>

<span style="font-family: Courier New;"> 整个View的代码如下:</span>

<div>
<span style="background: yellow;"><%</span><span style="color: blue;">@ </span><span style="color: maroon;">Page </span><span style="color: red;">Language</span><span style="color: blue;">="C#" </span><span style="color: red;">MasterPageFile</span><span style="color: blue;">="~/Views/Shared/Site.Master" </span><span style="color: red;">Inherits</span><span style="color: blue;">="System.Web.Mvc.ViewPage" </span><span style="background: yellow;">%>

</span><span style="color: blue;"><</span><span style="color: maroon;">asp</span><span style="color: blue;">:</span><span style="color: maroon;">Content </span><span style="color: red;">ID</span><span style="color: blue;">="Content1" </span><span style="color: red;">ContentPlaceHolderID</span><span style="color: blue;">="TitleContent" </span><span style="color: red;">runat</span><span style="color: blue;">="server">
    </span>Home Page
<span style="color: blue;"></</span><span style="color: maroon;">asp</span><span style="color: blue;">:</span><span style="color: maroon;">Content</span><span style="color: blue;">>
<</span><span style="color: maroon;">asp</span><span style="color: blue;">:</span><span style="color: maroon;">Content </span><span style="color: red;">ID</span><span style="color: blue;">="Content2" </span><span style="color: red;">ContentPlaceHolderID</span><span style="color: blue;">="MainContent" </span><span style="color: red;">runat</span><span style="color: blue;">="server">
</span><span style="background: yellow;"><%</span> <span style="color: #2b91af;">XElement </span>xml = (<span style="color: #2b91af;">XElement</span>)ViewData[<span style="color: #a31515;">"xml"</span>]; <span style="background: yellow;">%></span> 
 <span style="background: yellow;"><%</span>Html.BeginForm(); <span style="background: yellow;">%></span>  

   <span style="background: yellow;"><%
</span>   <span style="color: blue;">string </span>label = <span style="color: #a31515;">" <div  style=/"left: {0}px; position: absolute; top: {1}px/">{2}</div>"</span>;
   <span style="color: blue;">string </span>input = <span style="color: #a31515;">"<input name=/"{0}/" type=/"{1}/"  class=/"{2}/"   style=/"left: {3}px; position: absolute; top: {4}px/" value=/"{5}/"  />"</span>;
   <span style="color: #2b91af;">StringBuilder </span>sb = <span style="color: blue;">new </span><span style="color: #2b91af;">StringBuilder</span>();
   sb.Append(<span style="color: #a31515;">"    <div style=/"height:200px/"> "</span>);
   <span style="color: blue;">foreach</span>(<span style="color: #2b91af;">XElement </span>f <span style="color: blue;">in </span>xml.Elements()) 
   {
     sb.Append(<span style="color: blue;">string</span>.Format(label, <span style="color: blue;">int</span>.Parse(f.Attribute(<span style="color: #a31515;">"left"</span>).Value) - 60, f.Attribute(<span style="color: #a31515;">"top"</span>).Value, f.Attribute(<span style="color: #a31515;">"name"</span>).Value));
     sb.Append(<span style="color: blue;">string</span>.Format(input, f.Attribute(<span style="color: #a31515;">"name"</span>).Value, f.Attribute(<span style="color: #a31515;">"type"</span>).Value, f.Attribute(<span style="color: #a31515;">"class"</span>).Value, f.Attribute(<span style="color: #a31515;">"left"</span>).Value, f.Attribute(<span style="color: #a31515;">"top"</span>).Value, f.Value));
   }
     sb.Append(<span style="color: #a31515;">"</div > "</span>);
     Response.Write(sb.ToString());
    <span style="background: yellow;">%></span> 
 <span style="color: blue;"><</span><span style="color: maroon;">input </span><span style="color: red;">type</span><span style="color: blue;">="submit" </span><span style="color: red;">value</span><span style="color: blue;">="Submit!" />  
 </span><span style="background: yellow;"><%</span>Html.EndForm(); <span style="background: yellow;">%></span> 
<span style="color: blue;"></</span><span style="color: maroon;">asp</span><span style="color: blue;">:</span><span style="color: maroon;">Content</span><span style="color: blue;">>
</span>


效果:

1、显示XML表单:

<img style="display: inline; border-width: 0px;" title="ggg" src="http://images.cnblogs.com/cnblogs_com/zhuqil/WindowsLiveWriter/ASP.NETMVC2_5E2/ggg_thumb.jpg" border="0" alt="ggg" width="823" height="322">

<span style="font-family: Courier New;">2、</span>提交表单:

<img style="display: inline; border-width: 0px;" title="hhh" src="http://images.cnblogs.com/cnblogs_com/zhuqil/WindowsLiveWriter/ASP.NETMVC2_5E2/hhh_thumb.jpg" border="0" alt="hhh" width="818" height="194"> <a href="http://11011.net/software/vspaste"></a>



总结:这个是一种通过表单设计器产生动态表单最简单的方式。也是非常通用的一种方式。在产生html的时候,你可以带上Jquery的验证的脚本。当然还有很多的扩展和完善。点击下载本文代码

求助与讨论:开发表单设计器是我心里的一块石头,估计也是很多正在开发BPM、OA之类童鞋心中的一块石头。最近一直在思考这个问题,从这篇文章可以看到,我我设计的表单设计器上的控件可以随意拖放的。在生成HTML的时候,使用div的绝对布局,打算朝这个方向做,不知道可行否。下面是我想到的一些问题:

1、采用什么技术或者模式开发表单设计器;2、如何最好的定位;3、在设计器上如何操作表格以及主从表;4、数据源的绑定;5、数据的验证;

如果你开发过表单设计器、或者有这方面的研究和心得、或者有这方面的兴趣、欢迎在此一起讨论。

 
0
0
分享到:
评论

相关推荐

    Asp.Net MVC案例教程

    Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程 Asp.Net MVC案例教程

    ASP.NET MVC企业实战源代码Chapter12.rar

    本书共分为12章,以符合初学者思维的方式系统地介绍ASP.NET MVC的应用技巧,并结合实际项目详细地介绍如何基于ASP.NET MVC构建企业项目。通过本书的学习,读者可以全面掌握ASP.NET MVC的开发,并从代码中获取软件...

    ASP.NET MVC项目实例

    ASP.NET MVC从一开始的设计思路就与Struts不同,它的映射是利用路由配置而非xml,从而大大降低了开发复杂度,并且比Struts要更直观,更容易上手。可是,这并不表明ASP.NET MVC就是尽善尽美的。以下是MVC的一个项目...

    asp.net MVC4 CMS

    asp.net MVC4 CMS 完整的源代码,学习和提高asp.net mvc4可以参考一下。

    AngularJS开发ASP.NET MVC

    AngularJS 开发 ASP.NET MVC.

    ASP.NET MVC 2

    ASP.NET MVC 2 原版书籍 ASP.NET MVC 2 原版书籍 ASP.NET MVC 2 原版书籍

    ASP.net MVC3 中文教程

    ASP.net MVC3 中文教程ASP.net MVC3 中文教程ASP.net MVC3 中文教程ASP.net MVC3 中文教程

    asp.net mvc4 ztree 连接数据库 动态生成菜单简单demo

    asp.net mvc4 ztree 连接数据库 动态生成菜单简单demo

    ASP.NET MVC 5入门指南(中文PDF+源码)

    ASP.NET MVC 5 - 开始MVC 5之旅 2. ASP.NET MVC 5 - 控制器 3. ASP.NET MVC 5 - 视图 4. ASP.NET MVC 5 - 将数据从控制器传递给视图 5. ASP.NET MVC 5 - 添加一个模型 6. ASP.NET MVC 5 - 创建连接字符串并使用SQL ...

    ASP.NET MVC 4高级编程(第4版)清晰完整PDF版

    MVC专家“梦之队”对ASP.NET MVC 4的全新诠释 由Microsoft专家和极受敬重的软件开发社区负责人撰写的《ASP.NET MVC 4高级编程(第4版)》将带您学习最前沿的Web框架:ASP.NET MVC 4。本书开篇简要介绍ASP.NET MVC框架...

    Pro ASP.NET MVC 5 Platform(Apress,Adam.Freeman,2014)

    The power of ASP.NET MVC 5 stems from the underlying ASP.NET platform. To make your ASP.NET MVC applications the best they can be, you need to fully understand the platform features and know how they ...

    ASP.NET MVC 4高级编程 第4版PDF.rar

    ASP.NET MVC 是微软官方提出的一种Web开发框架,通过M是模型(model)-V视图(view)-C控制器(controller)l来设计创建Web应用程序。截至目前最新版本是MVC5,相对于之前的版本MVC5其可扩展性、易用性等方面都不很大的...

    【免费】ASP.NET MVC5 高级编程[附源码].rar

    ASP.NET MVC5高级编程(第5版.NET开发经典名著)作为Microsoft备受欢迎的MVC技术的最新版本,MVC 5是一个成熟的Web应用程序框架,支持快速的、TDD友好的开发。MVC允许开发人员创建动态的、数据驱动的网站。这样的...

    [ASP.NET MVC] ASP.NET MVC 4 实战 (英文版)

    ASP.NET MVC 4 in Action is a hands-on guide that shows you how to apply ASP.NET MVC effectively. After a high-speed ramp up, this thoroughly revised new edition explores each key topic with a self-...

    asp.net mvc 弹出窗口 技巧

    asp.net mvc 弹出窗口 技巧asp.net mvc 弹出窗口 技巧asp.net mvc 弹出窗口 技巧asp.net mvc 弹出窗口 技巧

    ASP.NET MVC5

    ASP.NET MVC5 高清完整版,适合新手学习,理解MVC架构

    dwz框架 asp.net mvc3

    dwz框架 asp.net mvc3;dwz框架 asp.net mvc3;dwz框架 asp.net mvc3

    Pro ASP.NET MVC 5 (精通ASP.NET MVC5框架) 中文+英文+配套源代码

    Pro ASP.NET MVC 5 (精通ASP.NET MVC5框架) 中文+英文+配套源代码

    Asp.Net mvc 3

    Asp.Net mvc 3,Asp.Net mvc 3,Asp.Net mvc 3,Asp.Net mvc 3,Asp.Net mvc 3,Asp.Net mvc 3,Asp.Net mvc 3,Asp.Net mvc 3,Asp.Net mvc 3

Global site tag (gtag.js) - Google Analytics