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

     在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 2 新闻系统

    ASP.NET MVC 2 新闻系统是一个专为初学者设计的项目,旨在帮助开发者熟悉ASP.NET MVC2框架在构建新闻发布应用中的具体应用。这个小型系统提供了基础的新闻管理功能,包括新闻的添加、编辑和展示,是学习MVC2开发流程...

    ASP.NET MVC学习资料

    - **URL映射**:ASP.NET MVC提供了一种灵活的方式来定义URL路由规则,使得开发者可以根据需要创建简洁的URL。例如,`/products/edit/4`可以映射到`ProductsController`类的`Edit`方法。 - **视图模板**:支持使用...

    asp.net mvc 客户端验证

    特别是ASP.NET MVC 2版本引入了一系列新功能,极大地简化了验证过程,并增强了用户体验。本文将详细介绍如何使用ASP.NET MVC 2框架来实现客户端验证,重点介绍DataAnnotation验证特性的使用。 #### 二、ASP.NET MVC...

    (菜鸟要飞系列)二,基于Asp.Net MVC5的后台管理系统(实现用户的增删改查)

    Asp.Net MVC5是一个强大的Web应用程序开发框架,它结合了Model-View-Controller(MVC)设计模式,提供了一种组织和构建动态网站的有效方式。同时,我们将假设数据库选用的是Oracle,一个广泛使用的关系型数据库管理...

    Professional ASP.NET MVC 4

    - **第一个ASP.NET MVC 应用**:通过一个简单的“Hello World”应用示例,引导读者快速上手。 **第2章:Controllers(控制器)** - **控制器的基本概念**:解释控制器在MVC架构中的角色及职责。 - **创建控制器**:...

    asp.net mvc

    ASP.NET MVC(Model-View-Controller)是一种基于微软.NET Framework的开源web应用程序开发框架,它为构建可维护、可测试且具有高度分离关注点的Web应用程序提供了强大的支持。本实例旨在帮助初学者理解并掌握ASP...

    ASP.NET MVC Framework Unleashed

    - **第2章:构建简单的ASP.NET MVC应用** - **环境搭建**:介绍安装Visual Studio等工具的过程。 - **项目创建**:指导如何创建一个新的ASP.NET MVC项目。 - **基本功能实现**:如主页显示、用户登录等。 - **第...

    .NETMVC @Razor

    Razor视图引擎则是.NET MVC中用于渲染HTML模板的一种强大语法,它使得在C#或VB.NET代码中嵌入HTML变得简单而直观。在这个".NET MVC @Razor"项目中,我们将会探讨如何利用这些技术来实现常见的Web应用功能,如增删改...

    ASP.NET MVC

    在创建一个ASP.NET MVC项目时,会自动生成一些默认的文件和目录,如Controllers、Models、Views等。每个目录都有其特定的作用: - **Controllers**:包含应用程序的控制器类,每个类通常对应一个特定的视图或功能。...

    ASP.NEt购物网站

    ASP.NET是微软公司推出的用于构建Web应用程序的开发框架,它提供了一种高效、安全且易于维护的方式来构建动态网站、Web服务以及丰富的互联网应用。在这个项目中,我们主要探讨ASP.NET 2.0版本所涉及的核心技术和在...

    asp.net简单博客

    ASP.NET是一种由微软开发的服务器端Web应用程序框架,用于构建动态网站、 web 应用程序和 web 服务。在这个“asp.net简单博客”的项目中,我们可以深入探讨ASP.NET如何被用来实现一个基本的博客系统,这将涵盖以下几...

    用ASP.NET做的简易留言板(带验证码)

    ASP.NET是一种由微软开发的服务器端Web应用程序框架,主要用于构建动态网站、Web应用程序和Web服务。在这个"用ASP.NET做的简易留言板(带验证码)"项目中,开发者利用ASP.NET的特性和功能实现了一个基本的在线交流平台...

    ASP.NET简易_图片存储文件上传.rar

    ASP.NET是一种基于.NET Framework的服务器端网页开发技术,由微软公司推出,旨在简化Web应用程序的构建过程。在ASP.NET框架下,开发人员可以利用丰富的工具和API来创建动态、交互式的网页应用。在这个"简易_图片存储...

    asp.net MVC实现简单的上传功能

    表单的`action`属性通过`Url.Action`方法动态生成,指向控制器中的`upload2`方法。表单中包含一个文件上传控件和一个提交按钮。 **后台控制器(HomeController)代码解析:** ```csharp public ActionResult upload...

    一步一步学asp.net_mvc_中文版.pdf

    ASP.NET MVC 是一种用于构建动态网站的应用程序框架,它采用了 Model-View-Controller(模型-视图-控制器)设计模式。这种模式有助于将业务逻辑、用户界面以及应用流程控制分开,从而提高开发效率和维护性。 - **...

    asp.net 幻灯片和详细例子

    - ASP.NET是一种服务器端技术,可以生成动态网页。 - 它提供了多种开发模式,如Web Forms、MVC、Web API和Blazor。 - Web Forms是ASP.NET最初提供的模型,使用控件驱动的方式构建页面。 - MVC(Model-View-...

    Captcha asp.net生成验证码的源代码

    在ASP.NET环境中,生成验证码涉及编程技术,包括图像处理、随机数生成以及字体操作等。本篇文章将详细探讨如何在ASP.NET中创建验证码源代码。 首先,我们需要了解验证码的基本原理。验证码通常包含一组随机生成的...

    asp.netmvc3.0简单实例

    ASP.NET MVC 3.0 是一个用于构建动态网站的开源框架,它结合了ASP.NET的灵活性和模型-视图-控制器(MVC)设计模式的优势。这个实例旨在提供一个简单的入门指南,帮助开发者理解如何在实际项目中运用ASP.NET MVC 3.0...

Global site tag (gtag.js) - Google Analytics