最近在用MVC开发的时候,师姐说所有用到的控件都要写在后台,然后从后台发到前台,这样就改变了以前把页面做死了的缺点。但是在实现的时候,遇到了点儿问题,如图:
上面代码写了一个LinkButton,当调用这个静态方法后,会生成一个LinkButton的HTML代码,这个是比较简单的元件,如果,现在我要拼接一个功能齐全的DataGridView控件,要这个控件有分页栏,各种添加删除功能,CSS样式,为了复用我们的EasyUI元件库,估计这个HTML代码也得有半页多吧。如果我要在每次遇到参数的时候都要截断字符,而且还要为代码里面的引号添加转义符,感觉挺麻烦的。那么,有没有一种不用截断字符的方式呢?
现在回想一下我们以前学习三层的时候是如何在D层避免SQL注入的,我们引入了参数来避免拼接字符。按照这个思路,我们也可以在字符串里面定义参数,然后真正调用的时候,再用参数替代掉占位符。
在这里,我们使用String的一个Replace方法,然后利用字符串的替换,将参数传入。
下面来看下Demo:
首先说明下,因为是为了做Demo,所以很多分层上的东西都被我简化掉了,只求在逻辑上能实现。
下面是控制器类和生成简单form的代码:
需要仔细体会下replace方法,有没有感觉到这是另一种变量赋值的表达式?
public class TestController : Controller { //建立一个控件的HTML代码 public String ConvertSingleForm(String singleFormID, String SingleForm_table_ID, String method)//参数为formID,tableID,form的提交方式 //上面参数都是字符串,用来取代html代码中的属性值 { //建立控件的HTML字符串,其中,所有引号都用"代替; //用"代替有两个原因: //1,在后面replace的时候进行转换 //2,"在html中是特殊字符,会被自动解析为引号 String htmlSingleForm = @" <form id="singleForm" method="post" ><table id="SingleForm_table_ID" bgcolor="00FF99"><tr> <td>密码</td> <td>3455467547556634568568568643</td> </tr> <tr> <td>密码</td> <td>3455467547556634568568568643</td> </tr> </table></form>"; htmlSingleForm = htmlSingleForm.Replace(""", "\""); //转换引号 htmlSingleForm = htmlSingleForm.Replace("singleForm", singleFormID); //formID赋值 htmlSingleForm = htmlSingleForm.Replace("SingleForm_table_ID", SingleForm_table_ID);//tableID赋值 htmlSingleForm = htmlSingleForm.Replace("post", method); //form提交方式赋值 return htmlSingleForm;//返回 } public ActionResult Index() { // ViewBag.form1 = htmlConvert.ConvertSingleForm("singleForm", "234", "post"); ViewBag.form1 = ConvertSingleForm("singleForm", "234", "post");//把一个form控件装入ViewBag中,然后传到视图 return View(); } }
当调用控制器中的index方法后,会返回Index视图,下面是Index视图中代码:
@if (ViewBag.form1!= null) { @Html.Raw(ViewBag.form1.ToString()) //解析成HTML代码显示在页面上 }
利用html的Raw方法,将字符再解析成html代码。
在有了这个Demo后,我们只需把生成控件的所有HTML代码放到一个字符串里面,然后用Ctrl+f查找到所有引号,将它替换成",之后将做好的字符放到String或者StringBuilder中,在方法中写好变量的替换就ok了。
这样,我们就将生成控件的HTML代码当做一个整体进行处理,而不必拆开它再拼接回来。
这么做虽然有好处,但也留下了隐患,这个以后再说。
小结:思考无数种解决方案的过程比得到一个解决方案更有意思。