使用WebFrom来模拟一些MVC的MODEL与View的数据交互功能

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、要正确理解服务端与客户端所干的事情

时间: 2024-10-05 05:00:19

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

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

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

Spring MVC:Model、View、ModelAndView

个人理解:View为服务器上的某个文件容器,可以为JSP,FTL等动态页面文件,甚至是媒体文件等等,单单是一个文件.Model的作用是存储动态页面属性,动态页面文件即View可以在Model中获取动态数据,这样就实现了View和Model分离的目的.接下来分别对这三个做一下说明. 一.首先是View:View接口在org.springframework.web.servlet.View包内.核心方法: 1.getContentType()获取当前view的ContentType(),同http请

MVC中Controller与View之间数据互传

转自:http://blog.csdn.net/sknice/article/details/42323791 在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.Controller向View传递数据 1.使用ViewData传递数据 在Controller中定义如下: ViewData[“Message_ViewData”] = “ Hello ViewData!”; 在Vie

学习ASP.NET MVC框架揭秘笔记-View和Presenter交互的规则(针对SC模式)

2.            View和Presenter交互的规则(针对SC模式) View和Presenter之间的交互是整个MVP的核心,能否正确地应用MVP模式来架构我们的应用,主要取决于能否正确的处理View和Presenter两者之间的关系.在由Model.Presenter和View组成的三角关系中,核心元素不是View而是Presenter,Presenter不是View调用Model的中介,而是最终决定如何响应用户交互行为的决策者. View可以理解为Presenter委派到前端

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

1.在spring-mvc的配置文件中已经配置jsp的视图解析器 2.在Controller中使用Model的addAttribute方法添加属性name,msg 3.在jsp页面中使用${msg}取msg属性的值失败 4.失败输出 5.解决方法 在需要解析Model或者ModelAndView的jsp页面中添加:<%@ page isELIgnored="false" %> 6.成功输出 原文地址:https://www.cnblogs.com/jidanke/p/106

(四)ASP.NET MVC 中 Controller 给 View 传递数据的方式

1. ViewData: 以 ViewData["keyname"] = value 这样键值对的方式进行数据传送.在对应的 cshtml 中用 @ViewData["keyname"] 来获取值. 2. ViewBag: ViewBag 是 dynamic 类型的,是对 ViewData 的一人动态类型封装,用起来更方便,和 ViewData 共同操作一个数据 .在 Controller 中使用 ViewBag.keyname=value 来赋值,在 cshtml

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

1:ViewBag和ViewData 具体区别不做讨论,本处只演示ViewData的具体示例: Controler代码:ViewData["Employee"] = emp; View代码: @{ WebApplication1.Models.Employee emp=(WebApplication1.Models.Employee) ViewData["Employee"]; } <b>Employee Details </b><br

asp.mvc展示model

1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model 主要负责维持数据状态,将数据从数据存储器中检索并传递给控制器,客户端传送过来的数据通过处理后再传回数据存储系统中.是MVC中较为重要的一层.这里为什么说是数据存储器而不是数据库,我们以前经常说的就是重数据库中增删改查数据等等什么的,但是 MVC 的Model 不单单只能在数据库中操作数据也能通过其他方式操作数据.学过java的ssh三

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

和我们学习Asp.Net MVC一样,Asp.Net Core MVC的Model.View.Controller也和我们熟悉的Asp.Net MVC中的相似.不同的是我们在使用Asp.Net Core MVC的时候需要注入MVC. Asp.Net Core MVC注入 MVC 的方法有两种,一种是AddMvcCore(),它只是注入了MVC的一些核心的东西,不包括像返回的ViewResult.JsonResult等,如果要使用完整的MVC,需要使用另一种注入方式 AddMvc() 进行注入,A