当前ASP.NET MVC中@Html.Serialize和[Deserialize]的替代方案是什么?
ASP.NET MVC 5 中@Html.Serialize与[Deserialize]的替代方案
由于Microsoft.AspNet.Mvc.Futures包已停止维护,你可以通过以下几种方案替代原有序列化/反序列化逻辑:
方案一:手动JSON序列化与反序列化
这是最直接的替代方式,利用成熟的JSON序列化库实现:
- 视图层序列化:用
JsonConvert将对象序列化为字符串,存入隐藏字段
@Html.Hidden("SerializedData", Newtonsoft.Json.JsonConvert.SerializeObject(YourModel))
- 控制器层反序列化:接收字符串参数后手动反序列化为目标类型
[HttpPost] public ActionResult YourAction(string SerializedData) { var targetModel = Newtonsoft.Json.JsonConvert.DeserializeObject<YourModelType>(SerializedData); // 业务逻辑处理 }
注:Newtonsoft.Json是MVC 5项目的常用依赖,若未引用可通过NuGet安装。
方案二:使用MVC内置模型绑定
如果无需隐藏完整对象结构,可直接利用MVC原生的模型绑定能力:
- 在视图中为模型的每个属性生成对应表单字段(如
@Html.EditorFor(m => m.PropertyName)或@Html.EditorForModel()) - POST请求时,控制器Action直接接收模型类型参数,MVC会自动完成参数绑定:
[HttpPost] public ActionResult YourAction(YourModelType model) { // 业务逻辑处理 }
此方案更符合MVC的原生设计,但不适用于需要隐藏敏感属性或传递复杂嵌套对象的场景。
方案三:自定义扩展模拟原有Futures功能
若想尽量保留原有代码结构,可自定义HtmlHelper扩展和ActionFilter来模拟原特性:
- 自定义Serialize扩展方法
public static class HtmlSerializeExtensions { public static MvcHtmlString Serialize(this HtmlHelper htmlHelper, string name, object value) { var serializedValue = Newtonsoft.Json.JsonConvert.SerializeObject(value); return htmlHelper.Hidden(name, serializedValue); } }
- 自定义Deserialize特性
public class DeserializeAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { foreach (var param in filterContext.ActionDescriptor.GetParameters()) { var formKey = param.ParameterName; if (filterContext.HttpContext.Request.Form.ContainsKey(formKey)) { var serializedStr = filterContext.HttpContext.Request.Form[formKey]; var deserializedObj = Newtonsoft.Json.JsonConvert.DeserializeObject(serializedStr, param.ParameterType); filterContext.ActionParameters[param.ParameterName] = deserializedObj; } } base.OnActionExecuting(filterContext); } }
- 使用方式与原有逻辑一致
视图中仍用@Html.Serialize("model", YourModel),控制器Action添加[Deserialize]特性即可:
[HttpPost] [Deserialize] public ActionResult YourAction(YourModelType model) { // 业务逻辑处理 }
迁移至ASP.NET Core的适配提示
后续迁移到Core时,可将上述方案中的Newtonsoft.Json替换为Core内置的System.Text.Json,或直接利用Core更强的模型绑定能力,无需依赖第三方扩展。
内容的提问来源于stack exchange,提问作者Wout
相关产品推荐
相关产品推荐

