MVC中有一点非常闪瞎人眼的功能就是,可以根据Model与View视图来直接将页面也数据模型进行绑定,那么我们在想客户端发送页面时不需要进行各种控件赋值,不需要操心怎么渲染,当客户提交表单给服务器时也不需要进行过多的处理直接就能叫表单进行模型化。

那么我们在WebFrom中能否实现类似的功能呢,答案是肯定的。

第一步:建立模型。也就是将表单看着是一个对象,建立相关的属性。

namespace Models
{
using System;
using System.Collections.Generic; public partial class CST_cust_info
{
public int cust_id { get; set; }
public string cust_no { get; set; }
public string cust_full_name { get; set; }
public string cust_master_org_no { get; set; }
public string contract_type { get; set; }
public string cust_short_name { get; set; }
public string cust_mail { get; set; }
}
}

  第二步:建立页面与之对应(这里需要理解一个概念就是表单无论怎么变,最终提交到服务器后服务器对于表单是只认name,不认识其他的。如果表单的那么重复他也不管简单的合起来,还有客户端认识的控件就是靠runat=”server“属性和id来识别,所以name和id这两个东西一定需要处理好,当然通常在runat='server'的情况下,系统渲染的时候直接将id赋值给name属性)

<form id="formCC" runat="server"> 

                                    <asp:DropDownList ID="txt_card_type_id"  runat="server">                         </asp:DropDownList>

                                    <asp:DropDownList ID="txt_person_sex" runat="server" Width="94px">                         </asp:DropDownList>

                                     <asp:TextBox ID="txt_brith_date" runat="server"></asp:TextBox>

                                    <asp:TextBox ID="txt_certificate_date" runat="server" ></asp:TextBox>

                                   <asp:TextBox ID="txt_person_no" runat="server"   ></asp:TextBox> </FROM>...

  

 第三步:建立方法 让Model直接渲染到前台(这里只是简单的赋值,如果是通过render就更美妙了)

PS:1、这里面id名字因为项目中容易冲突,所以将这种反射交互的名称换成 Name=>"txt_"+Name模式来进行映射处理

2、这里需要了解的项目中经常使用的控件类型,一般居多的是WebControl 和HtmlInputControl,其中WebControl指的是继承WebControl这个类型的控件,一般有TextBox,Label等,HtmlInputControl控件就是一些<input runat="server">控件,两者区别在于渲染机制不一样,但是最后还是

       /// <summary>
/// 处理一对一信息
/// </summary>
/// <param name="CustPage"></param>
/// <param name="LableName"></param>
/// <param name="CSTModel"></param>
private static void FillMainCust<T>( CustPage CustPage, Dictionary<string, string> LableName, T CSTModel, int? sort = null)
{
if (CSTModel != null)
{
foreach (string key in LableName.Keys)
{
PropertyInfo pinfo = CSTModel.GetType().GetProperty(key); Control txtname = CustPage.FindControl<Control>("txt_" + key));
if (pinfo != null && txtname != null)
{
object PinValue = (pinfo.GetValue(CSTModel) ?? "");
string PinStr = ""; if (PinValue is DateTime || PinValue is DateTime?)
{
PinStr = ((DateTime)PinValue).ToString("yyyy-MM-dd");
}
else
{
if (PinValue is decimal || PinValue is decimal?)
{
PinStr = ((Decimal)PinValue).ToString("0.00");
}
else
{
PinStr = PinValue.ToString();
}
} #region 根据类型赋值
if (txtname is TextBox)
{
((TextBox)txtname).Text = PinStr;
}
else if (txtname is Label)
{
((Label)txtname).Text = PinStr;
}
else if (txtname is HiddenField)
{
((HiddenField)txtname).Value = PinStr;
}
#endregion #region 特殊处理
if (txtname is Label)
{
if (CustDictory.Special_Dictionary.Keys.Contains(key))
{
((Label)txtname).Text = P2PTable.GetSpecialValue(PinStr, CustDictory.Special_Dictionary[key]);
}
} #endregion #region 处理DropDownList赋值
if (txtname is DropDownList)
{ if (((DropDownList)txtname).Items.FindByValue(PinStr) != null)
{
((DropDownList)txtname).SelectedValue = PinStr;
}
else
{
if (((DropDownList)txtname).Items.FindByText(PinStr) != null)
{
((DropDownList)txtname).Items.FindByText(PinStr).Selected = true;
}
} }
#endregion
#region 处理隐藏控件赋值
if (txtname is System.Web.UI.HtmlControls.HtmlInputHidden)
{
((System.Web.UI.HtmlControls.HtmlInputHidden)txtname).Value = PinStr;
}
#endregion }
} }
}

 第四步: 提交时将from表单填充进入Model对象中 PS:1、此时就不需要考虑控件问题 只需要考虑From表单提交的数据即可,这里from表单提交我们已经在前面渲染的时候做好准备了

2、代码中为了节省性能所以就不遍历对象属性了,直接建立字典来保存要取的值,如果是不需要考虑这些可以直接取值

   foreach (string key in LableName.Keys)
{
string value = CustPage.Request.Form["txt_" + key];
PropertyInfo pinfo = custInfo.GetType().GetProperty(key);
if (value != null && pinfo != null)
{ object NewVlue = value.StringtoObject(pinfo);
pinfo.SetValue(custInfo, NewVlue);
}
}

  好~简单的一种反射机制与From表单特性结合的MV已经完成

这个示例我们需要了解的是:1、from表单是根据name进行提交的。

2、服务器控件最终都是要渲染给客户端的,有些控件是服务器不处理的

3、简单的一些反射使用

4、要正确理解服务端与客户端所干的事情

使用WebFrom来模拟一些MVC的MODEL与View的数据交互功能的更多相关文章

  1. MVC中Model,不仅仅只是数据的传递者

    在Model使用的时候很多人回向以前写三层架构一样使用它,将Model作为数据的传递者. 比如常见的写法 public int Id { get; set; } public int RoleId { ...

  2. Spring MVC:Model、View、ModelAndView

    个人理解:View为服务器上的某个文件容器,可以为JSP,FTL等动态页面文件,甚至是媒体文件等等,单单是一个文件.Model的作用是存储动态页面属性,动态页面文件即View可以在Model中获取动态 ...

  3. ASP.NET MVC之model传值view

    控制器中,我们有时会在知道用户名的情况下,再获取相关数据 例如: public ActionResult Index()        {            UserInfo Entity_Tem ...

  4. EL表达式无法获取Spring MVC的Model封装好的数据解决方法

    1.在spring-mvc的配置文件中已经配置jsp的视图解析器 2.在Controller中使用Model的addAttribute方法添加属性name,msg 3.在jsp页面中使用${msg}取 ...

  5. MVC中Control和View之间数据传递的方式

    1:ViewBag和ViewData 具体区别不做讨论,本处只演示ViewData的具体示例: Controler代码:ViewData["Employee"] = emp; Vi ...

  6. ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】

    今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...

  7. asp.mvc展示model

    1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model 主要负责维持数据状态,将数据从数据存 ...

  8. MVC中Model元数据及绑定机制

    ASP.NET MVC的Model为View Model,表示最终呈现在View上的数据,而Model元数据的一个重要的作用在于控制对象在View上的呈现方式.说得更加具体点,就是基于某种数据类型的M ...

  9. Asp.Net Core 入门(四)—— Model、View、Controller

    和我们学习Asp.Net MVC一样,Asp.Net Core MVC的Model.View.Controller也和我们熟悉的Asp.Net MVC中的相似.不同的是我们在使用Asp.Net Cor ...

随机推荐

  1. APP如何设计才能适配iphone6/plus和iphone5

    随着苹果发布两种新尺寸的大屏iPhone 6,iOS平台尺寸适配问题终于还是来了,移动设计全面进入"杂屏"时代.看看下面三款iPhone尺寸和分辨率数据就知道屏幕有多杂了. 移动a ...

  2. Android 数据库读取数据显示优化 Application [6]

    Application和Activity,Service一样是android框架的一个系统组件, 当android程序启动时系统会创建一个application对象,用来存储系统的一些信息. 通常我们 ...

  3. 从零开始学Sketch——进阶篇-b

    从零开始学Sketch——进阶篇 Sketch是一款矢量绘图应用,而矢量绘图无疑是目前进行网页.图标以及界面设计的最好方式. 在初识了Sketch的界面布局和基础工具之后,我们就可以开始进入高阶的Sk ...

  4. Could not launch process failed:security

    是因为  用了 企业的开发者账号   安装的时候需要  在 手机的设置中  找到 描述文件   然后点击信任这个对应的证书   才能使用这个由企业号发布的应用.

  5. kibo.js 处理键盘事件的Javascript工具库

    这个也是做在线编辑用到的 选中文字快捷键.提高编辑效率 https://github.com/marquete/kibo 用法很简单 Examples var k = new Kibo(); Sing ...

  6. C 编译器错误信息中文翻译

    Ambiguous operators need parentheses 不 明确的运算需要用括号括起 Ambiguous symbol ``xxx`` 不明确的符号 Argument list sy ...

  7. Qt中添加背景图片的方法

    工作似乎走上正轨了,上周五的工作是做一个界面,用到QFrame和QPushButton,QFrame做主面板,QPushButton为其子控件,需要在主面板上贴背景图片,还需要在QPushButton ...

  8. Android--广播BroadcastReceiver

    前言 Android四大组件,Activity.Service.ContentProvider.BroadcastReceiver,除了BroadcastReceiver之外,其他的在之前的博客中都有 ...

  9. 格式化字符串format函数

    自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和 ...

  10. UVAlive11324 The Largest Clique(scc+dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=30726 [思路] 强连通分量+动归. 求scc后缩点,以scc中的 ...