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的验证的脚本。当然还有很多的扩展和完善。点击下载本文代码。

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

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

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

时间: 2024-10-28 05:18:24

ASP.NET MVC 2生成动态表单的一种最简单的思路的相关文章

一起谈.NET技术,ASP.NET MVC 2生成动态表单的一种最简单的思路

在BPM.OA等系统中,都会存在一个表单设计器.有些是通过操作gridview来完成一个表单的设计:有些是通过类似VS拖拽的方法完成一个表单的设计.很明显后面一种优越于前面一种.无论是哪种,最后都会产生一些XML之类的表单结构的数据. 这篇文章将讲述,在表单设计器设计好表单之后,在ASP.NET MVC中如何将表单结构的xml转换成实际应用系统中的表单.看下面一个xml文件,我们假设它是由一个表单设计器设计出来的. <?xml version="1.0" encoding=&qu

支持ASP.NET MVC、WebFroM的表单验证框架ValidationSuar使用介绍

  这篇文章主要介绍了支持ASP.NET MVC.WebFroM的表单验证框架ValidationSuar使用介绍,本文详细讲解了使用步骤,并给出一个完整Demo下载,需要的朋友可以参考下 1.支持javascript端和后端的双重验证 (前端目前依赖于jquery.validate.js,也可以自已扩展) 2.代码简洁 3.调用方便 4.功能齐全 使用方法: 新建初始化类,将所有需要验证的在该类进行初始化,语法相当简洁并且可以统一管理,写完这个类你的验证就完成了70% 函数介绍: Add 默认

支持ASP.NET MVC、WebFroM的表单验证框架ValidationSuar使用介绍_实用技巧

1.支持javascript端和后端的双重验证 (前端目前依赖于jquery.validate.js,也可以自已扩展) 2.代码简洁 3.调用方便 4.功能齐全 使用方法: 新建初始化类,将所有需要验证的在该类进行初始化,语法相当简洁并且可以统一管理,写完这个类你的验证就完成了70% 函数介绍: Add 默认类型(邮件.手机.qq等) AddRegex 正则验证 在Add无法满足情部下使用 addFunc 使用js函数进行验证,一般用于业逻辑的验证 ,功能非常强大,可以满足各种验证(注意:add

ASP写的自动生成SELECT表单的函数

对于ASP高手当然没什么用了,但是对于刚入门的初学者和美工就有些用处了. Function selectdo(a,d,b,c)  Response.write"<select name='"&a&"'><option>"&d&"</option>"  for i=b to c    if i<10 then      i="0"&i    end

ASP 写的自动生成SELECT 表单的函数

对于ASP高手当然没什么用了,但是对于刚入门的初学者和美工就有些用处了.Function selectdo(a,d,b,c) Response.write"<select name='"&a&"'><option>"&d&"</option>" for i=b to c if i<10 then i="0"&i end if Response.w

ASP 写的自动生成SELECT 表单的函数_ASP基础

对于ASP高手当然没什么用了,但是对于刚入门的初学者和美工就有些用处了. Function selectdo(a,d,b,c)  Response.write"<select name='"&a&"'><option>"&d&"</option>"  for i=b to c    if i<10 then      i="0"&i    end

spring mvc 防止重复提交表单的两种方法,推荐第二种

第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package com.thinkgem.jeesite.common.repeat_form_validator; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.ann

ASP.NET MVC 使用 Ajax 提交表单,后台接收后值为 null?

问题描述 @using(Ajax.BeginForm(ajaxopts)){@Html.LabelFor(model=>model.comment.FileId,htmlAttributes:new{@class="control-labelcol-md-2"})<inputclass="form-controltext-boxsingle-line"data-val="true"data-val-number="Thefi

asp.net 动态表单之数据分页_实用技巧

但是问题来了,不同科系的同学的科目是不一样的,那么我们在数据库设计的时候通常是把学生.某科成绩作为一条记录,那么这个时候我们就需要做一个行转列的逻辑处理了. 解决方法: 使用GridView来生成表单,这个实现起来会比较麻烦,如果要在列表里面显示链接就更不可能了: 生成html再输出到页面中,这个实现起来比较灵活.方便: 基本功能点: 动态生成表头: 数据进行分页: 查询数据: 对每个成绩进行超链接,查看明细:  页面代码 复制代码 代码如下: <div id="dataDiv1"