ASP.NET MVC 2生成动态表单的一种最简单的思路
在BPM、OA等系统中,都会存在一个表单设计器。有些是通过操作gridview来完成一个表单的设计;有些是通过类似VS拖拽的方法完成一个表单的设计。很明显后面一种优越于前面一种。无论是哪种,最后都会产生一些XML之类的表单结构的数据。
这篇文章将讲述,在表单设计器设计好表单之后,在ASP.NET MVC中如何将表单结构的xml转换成实际应用系统中的表单。看下面一个xml文件,我们假设它是由一个表单设计器设计出来的。
<?xml version="1.0" encoding="utf-8" ?> <form name="form1"> <field type="text" name ="firstname" class ="textbox" left="300" top="200">朱</field> <field type="text" name ="lastname" class ="textbox" left="700" top="200">祁林</field> <field type="text" name ="sex" class ="textbox" left="300" top="240">男</field> <field type="text" name ="age" class ="textbox" left="700" top="240">24</field> </form>
下面,我将把它转化成实际的asp.net mvc系统中的表单。首先,使用LinqtoXML将上面的XML文件转换成XElement,代码如下。在控制器中最好不要直接读取文件,这里为了简单直观起见,就直接在Controller中读取xml文件了。
[AcceptVerbs(HttpVerbs.Get)] public ActionResult Index() { XElement xml = XElement.Load(Server.MapPath("~/App_Data/form1.xml")); ViewData["xml"] = xml; return View(); } 接着我们将在View中,将上面的XElement转换成真正的HTML表单。
在表单设计器中很难的一块就是控件的定位。从我提供的XML中可以看到,它里面是存放了位置信息的。这使我们想到了div的绝对布局。这个方法在这种情况下非常的适合。
下面,我定义两个字符串模板:
string label = " <div style=\"left: {0}px; position: absolute; top: {1}px\">{2}</div>"; string input = "<input name=\"{0}\" type=\"{1}\" class=\"{2}\" style=\"left: {3}px; position: absolute; top: {4}px\" value=\"{5}\" />";
label用于显示文本信息,input用于显示表单上的value。下面通过循环产生html脚本。
StringBuilder sb = new StringBuilder(); sb.Append(" <div style=\"height:200px\"> "); foreach(XElement f in xml.Elements()) { sb.Append(string.Format(label, int.Parse(f.Attribute("left").Value) - 60, f.Attribute("top").Value, f.Attribute("name").Value)); sb.Append(string.Format(input, f.Attribute("name").Value, f.Attribute("type").Value, f.Attribute("class").Value, f.Attribute("left").Value, f.Attribute("top").Value, f.Value)); } sb.Append("</div > ");
最后通过Response.Write(sb.ToString())输出。
整个View的代码如下:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> Home Page </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <% XElement xml = (XElement)ViewData["xml"]; %> <%Html.BeginForm(); %>
<% string label = " <div style=\"left: {0}px; position: absolute; top: {1}px\">{2}</div>"; string input = "<input name=\"{0}\" type=\"{1}\" class=\"{2}\" style=\"left: {3}px; position: absolute; top: {4}px\" value=\"{5}\" />"; StringBuilder sb = new StringBuilder(); sb.Append(" <div style=\"height:200px\"> "); foreach(XElement f in xml.Elements()) { sb.Append(string.Format(label, int.Parse(f.Attribute("left").Value) - 60, f.Attribute("top").Value, f.Attribute("name").Value)); sb.Append(string.Format(input, f.Attribute("name").Value, f.Attribute("type").Value, f.Attribute("class").Value, f.Attribute("left").Value, f.Attribute("top").Value, f.Value)); } sb.Append("</div > "); Response.Write(sb.ToString()); %> <input type="submit" value="Submit!" /> <%Html.EndForm(); %> </asp:Content>
效果:
1、显示XML表单:
2、提交表单:
总结:这个是一种通过表单设计器产生动态表单最简单的方式。也是非常通用的一种方式。在产生html的时候,你可以带上Jquery的验证的脚本。当然还有很多的扩展和完善。点击下载本文代码。
后话:从这篇文章可以看到,打算设计的表单设计器上的控件可以随意拖放的,位置随意摆设的。在生成HTML的时候,使用div的绝对布局,打算朝这个方向做,不知道可行否。
(全文完)
以下为广告部分
您部署的HTTPS网站安全吗?
如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!
快速了解HTTPS网站安全情况。
安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。
安装部署SSL证书变得更方便。
SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。
让服务器远离SSL证书漏洞侵扰
TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述