MVC MVVM Knockout viewmodel 提交 完整过程,包含序列化 JSON 和 字典模型绑定
//JSON 通用操作------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace DotNet.Common
{
/// <summary>
/// JSON序列化和反序列化辅助类
/// </summary>
public class JsonHelper
{
private static bool? _isEncrypt;
public static bool IsEncrypt
{
get
{
bool result = false;
if (_isEncrypt == null)
{
if (System.Configuration.ConfigurationManager.AppSettings["ConStringEncrypt"] == "true")
{
result = true;
}
}
else
{
result = (bool)JsonHelper._isEncrypt;
}
return result;
}
set { JsonHelper._isEncrypt = value; }
} /// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
//替换Json的Date字符串
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
Regex reg1 = new Regex(@"\\/Date\((-\d+)\+\d+\)\\/");
jsonString = reg.Replace(jsonString, matchEvaluator);
jsonString = reg1.Replace(jsonString, matchEvaluator);
if (IsEncrypt)
{
return DotNet.Common.DEncrypt.DESEncrypt.Encrypt(jsonString);
}
else
{
return jsonString;
} } /// <summary>
/// JSON反序列化
/// </summary>
///
public static T JsonDeserialize<T>(string jsonString)
{
if (IsEncrypt)
{
jsonString = DotNet.Common.DEncrypt.DESEncrypt.Decrypt(jsonString);
}
//将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
} /// <summary>
/// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
/// </summary>
private static string ConvertJsonDateToDateString(Match m)
{
string result = string.Empty;
DateTime dt = new DateTime(, , );
dt = dt.AddMilliseconds(long.Parse(m.Groups[].Value));
dt = dt.ToLocalTime();
result = dt.ToString("yyyy-MM-dd HH:mm:ss");
return result;
} /// <summary>
/// 将时间字符串转为Json时间
/// </summary>
private static string ConvertDateStringToJsonDate(Match m)
{
string result = string.Empty;
DateTime dt = DateTime.Parse(m.Groups[].Value);
dt = dt.ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);
return result;
}
}
}
//--------------------------------------------------
//自定义帮助类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace DotNet.Common.Json
{
public class SerializeHelper : IDataSerialize
{
public string Serializer<T>(T t)
{
return JsonHelper.JsonSerializer<T>(t);
} public T Deserialize<T>(string jsonString)
{
return JsonHelper.JsonDeserialize<T>(jsonString);
}
}
}
//页面JS代码,定义 knockout viewmodel 和一些 自定义方法
//Json对象转字符串的方法
function json2str(obj) {
var S = [];
for (var i in obj) {
obj[i] = typeof obj[i] == 'string' ? '"' + obj[i] + '"' : (typeof obj[i] == 'object' ? json2str(obj[i]) : obj[i]);
S.push(i + ':' + obj[i]);
}
return '{' + S.join(',') + '}';
} function KeyValuePair() {
this.Key = ko.observable();
this.Value = ko.observable();
}
//企业基本信息viewmodel
var BaseInfo = {
//{ {a:1},{b:2} }
企业名称: ko.observable(""),
企业简介: ko.observable(""),
自定义属性: ko.observableArray([new KeyValuePair()]),
联系电话: ko.observableArray([]),
企业logo: ko.observable()
};
//营业执照ViewModel
var YingYeZhiZhaoVM = {
名称: ko.observable(),
企业类型: ko.observable(),
住所: ko.observable(),
经营范围: ko.observable(),
注册号: ko.observable(),
注册资本: ko.observable(),
法定代表人: ko.observable(),
发证时间: ko.observable(),
登记机关: ko.observable(),
营业执照照片: ko.observable()
} function DelMobile(obj) {
BaseInfo.联系电话.remove(obj);
}
function AddMobile(obj) {
var tel = /^(((1[0-9]{1})|(1[0-9]{1}))+\d{9})$/;
if (!tel.test(obj)) {
alert("手机号格式不正确!");
return;
}
var canPush = true; $(BaseInfo.联系电话()).each(function (index, item) {
if (item == obj.trim()) { canPush = false; alert("联系电话已存在!"); }
}); if (canPush) {
BaseInfo.联系电话.push(obj);
$('#addMobile').val('');
}
}
//自定义属性 在后台定义的是 字典<string,string> 对于字典对象的操作这么写;
function SetKeyValue(key, value) {
var canPush = true; if (key == "" || value == '') {
alert("属性名或属性值不能为空!");
return;
} $(BaseInfo.自定义属性()).each(function (index, item) {
if (item.Key() == key.trim()) { canPush = false; alert("属性名已存在!"); }
});
if (canPush) {
BaseInfo.自定义属性.push(new KeyValuePair().Key(key).Value(value));
$("#new_Key").val("");
$("#new_Value").val("");
}
}
function RemoveKeyValue(key) {
$(BaseInfo.自定义属性()).each(function (index, item) {
if (item.Key() == key) {
BaseInfo.自定义属性.splice(index, 1);
}
});
}
异步加载数据-------------------------------------------------也就是给 viewmodel 赋值;
//加载信息
function LoadData() {
ModalDialog.open({ 遮罩: true, 等待: true });
$.ajax({
url: '@Url.Action("EnterpriseInfoData")',
type: 'post',
data: {},
dataType: 'json',
success: function (result) {
var model = [];
$(result.vm企业基本信息.自定义属性).each(function (i, item) {
var obj = new KeyValuePair();
obj.Key(item.Key);
obj.Value(item.Value);
model.push(obj);
});
if (result != null) {
BaseInfo.自定义属性(model);
BaseInfo.企业名称(result.vm企业基本信息.企业名称);
BaseInfo.联系电话(result.vm企业基本信息.联系电话);
BaseInfo.企业简介(result.vm企业基本信息.企业简介);
BaseInfo.企业logo(result.vm企业基本信息.企业logo);
if (result.vm企业基本信息.企业logo != null && result.vm企业基本信息.企业logo != '') {
$("#oldimg").show();
}
YingYeZhiZhaoVM.名称(result.vm营业执照.名称);
YingYeZhiZhaoVM.企业类型(result.vm营业执照.企业类型);
YingYeZhiZhaoVM.住所(result.vm营业执照.住所);
YingYeZhiZhaoVM.经营范围(result.vm营业执照.经营范围);
YingYeZhiZhaoVM.注册号(result.vm营业执照.注册号);
YingYeZhiZhaoVM.注册资本(result.vm营业执照.注册资本);
YingYeZhiZhaoVM.法定代表人(result.vm营业执照.法定代表人);
YingYeZhiZhaoVM.发证时间(result.vm营业执照.发证时间);
YingYeZhiZhaoVM.登记机关(result.vm营业执照.登记机关);
YingYeZhiZhaoVM.营业执照照片(result.vm营业执照.营业执照照片);
ModalDialog.close();
}
},
error: function () {
ModalDialog.close(); }
});
后台数据加载写法;
public string EnterpriseInfoData()
{ var v_企业 = _用户企业信息.Get企业信息(CookieHelper.GetCookieValue("EnterpriseId"));
var result = new DotNet.Common.Json.SerializeHelper().Serializer<VM.企业页面信息>(v_企业);
return result;
// return Json(v_企业);
}
viewmodel 定义好了 ,数据也准备好了。下面是模型绑定的处理;
以下 只展示 字典的绑定 绑定的写法 比较特殊。 knockout 在 他的 foreach 里 用 data-bind="click:fn()" 不知道为什么 会被自动调用
所以 只能用 data-bind="attr:{onclick:fu()}"这种方式来绑定;
<td>自定义属性:</td>
<td>
<div id="Custom_Attr" data-bind="foreach:{data:BaseInfo.自定义属性,as:'item'}">
<div class="input-group">
<input type="text" data-bind="value:item.Key" disabled class="col-md-5" placeholder="自定义属性名"><div style="float:left">:</div>
<input type="text" data-bind="value:item.Value" disabled class="col-md-6" placeholder="自定义属性值">
<span class="input-group-addon">
<a href="javascript:void(0)" data-bind="attr:{onclick:'RemoveKeyValue(\''+item.Key()+'\''+')'}"><i class="fa fa-minus"></i></a>
</span>
</div>
</div>
<div class="input-group">
<input type="text" class="col-md-5" id="new_Key" placeholder="自定义属性名"><div style="float:left">:</div>
<input type="text" class="col-md-6" id="new_Value" placeholder="自定义属性值">
<span class="input-group-addon">
<a href="javascript:void(0)" data-bind="attr:{onclick:'SetKeyValue($(\'#new_Key\').val(),$(\'#new_Value\').val())'}"><i class="fa fa-plus"></i></a>
</span>
</div>
</td>
最后一步 数据提交 。以post 为例。 post 之前 要先 通过
var d = ko.toJS(BaseInfo);
var c = JSON.stringify(d);
这两步对 数据做处理;以下是完整 代码
function savebaseinfo() {
if (!$("#baseinfoForm").valid()) {
return;
}
var d = ko.toJS(BaseInfo);
var c = JSON.stringify(d);
ModalDialog.open({ 遮罩: true, 等待: true });
$.ajax({
url: encodeURI("@Url.Action("SaveBaseInfo", "EnterprisesManagement")"),
type: "post", //Post提交
data: { companyInfo: c },
traditional: true,
success: function (data) {
if (data == "1") {
alert("保存成功!");
}
ModalDialog.close();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
ModalDialog.close();
}
});
}
companyInfo: c //c 是序列化后的 jsonstring 然后是后台接收代码
public string SaveBaseInfo(string companyInfo)
{
VM.企业基本信息 model = DotNet.Common.JsonHelper.JsonDeserialize<VM.企业基本信息>(companyInfo);
_用户企业信息.Save企业信息(CookieHelper.GetCookieValue("EnterpriseId"), model);
return "";
}
后台接收的代码比较特殊 要 通过转换类 转成 需要的 类;
以上就是 knockout 完整 数据绑定 和 处理 字典类型绑定的 完整方法。
哈尔滨 山河软件,2014-06-14 13:53:31,崔园清;
MVC MVVM Knockout viewmodel 提交 完整过程,包含序列化 JSON 和 字典模型绑定的更多相关文章
- MVC MVVM Knockout 常遇问题总结
1.模板绑定(使用插件jquery.tmpl) var ViewModel={Product:ko.observable()} <div data-bind="template:{na ...
- ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)
上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...
- [转]ASP.NET MVC 4 (九) 模型绑定
本文转自:http://www.cnblogs.com/duanshuiliu/p/3706701.html 模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C ...
- ASP.NET MVC 4 (九) 模型绑定
模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C#间起着桥梁的作用.模型绑定的一个最简单的例子是带参数的控制器action方法,比如我们注册这样的路径映射: ...
- ASP.NET MVC 模型绑定
模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C#间起着桥梁的作用.模型绑定的一个最简单的例子是带参数的控制器action方法,比如我们注册这样的路径映射: ...
- 【ASP.NET Core】MVC 控制器的模型绑定(宏观篇)
欢迎来到老周的水文演播中心. 咱们都知道,MVC的控制器也可以用来实现 Web API 的(它们原本就是一个玩意儿),区别嘛也就是一个有 View 而另一个没有 View.于是,在依赖注入的服务容器中 ...
- 转载——Asp.Net MVC+EF+三层架构的完整搭建过程
转载http://www.cnblogs.com/zzqvq/p/5816091.html Asp.Net MVC+EF+三层架构的完整搭建过程 架构图: 使用的数据库: 一张公司的员工信息表,测试数 ...
- MVC & MVVM
什么是MVC,什么是MVVM? 面向过程 --> 面向对象 --> MVC --> MV* 面向过程: 开发人员按照需求逻辑顺序开发代码逻辑,主要思维模式在于如何实现.先细节,后整体 ...
- StartSSL免费SSL证书申请和账户注册完整过程
StartSSL算是比较早提供免费SSL证书的第三方提供商,我们可以免费申请且免费续期使用到有需要HTTPS网址的用户.关于网站使用SSL证书主要还是因为谷歌在向导说明中提到如果一个网站使用到SSL证 ...
随机推荐
- HDU 4738 Caocao's Bridges
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Photoshop Cs5 64位系统破解版下载(内含破解方法)
Photoshop Cs5 64位系统是电影.视频和多媒体领域的专业人士, 使用 3D 和动画的图形和 Web 设计人员, 以及工程和科学领域的专业人士的理想选择,下面提供Photoshop Cs5 ...
- (旧)子数涵数·PS——水杯抠图
一.首先老规矩,下载所需要的素材. 二.打开Photoshop,并打开已下载好的素材. 三.使用"钢笔工具",快捷键为P,采用"路径"模式,将水杯抠出(例图左上 ...
- MVC session过期如何处理跳转
以前我们总是会写一个基类也叫父类来判断session是否已过期然后跳转到指定的错误页面或者登陆界面,然后让所有的页面都继承这个基类,但是当我们应用到MVC项目中时,发现该方法并不会起作用.这时我们可以 ...
- APP发布Xcode7
一.准备工作 1>准备3.5寸.4寸.4.7寸.5.5寸的程序截图至少个1张,如果支持iPad,那么iPad截图也要有.这些截图尽量截取页面漂亮的,因为这些截图是要放在AppStore中展示的. ...
- 学习总结 JDBC
- 学习总结 java 创建及其练习
创建: 打开eclipse—文件—新建—java项目—项目名称命名—点击texe-1练习下拉箭头—右击src—新建—类—设置类名称(名称设置时不要添加空格),在“想要创建哪些方法跟”下面点击:publ ...
- JDBC链接MySQL和Oracle
import java.sql.*; JDBC中所要用的包几乎都在import?java.sql.*;中: 在项目中导入Oracel或者是MySQL包和装载驱动: 项目的Cla ...
- windows live writer向cnblog发布文章设置(转)
Windows Live Writer是非常不错的一个日志发布工具,支持本地写文章,非常方便将word 中内容,包括图片进行处理,有点感觉相见恨晚. Live Writer最新版本下载地址是什么? h ...
- Git入门详解
查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git checkout -b ...