ASP.NET MVC - 序列化 [英] ASP.NET MVC - Serializable
问题描述
我试图使用从furthure装配新的HTML辅助扩展序列化()。
I'm trying to use the new Html helper extension Serialize() from the furthure assembly..
如果你看一看:
查看
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<List<MvcApplication2.Models.ProductViewBinding>>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Import Namespace="Microsoft.Web.Mvc" %>>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Index</title>
</head>
<body>
<div>
<% using (Html.BeginForm("Index", "Products", FormMethod.Post))
{ %>
<% int codeIndex = 0;
foreach (var item in Model)
{ %>
<%: Html.TextBox("Encryption[" + codeIndex + "].Value") %>
<%: Html.Serialize("Encryption[" + codeIndex + "].ID", item.ID) %>
<% codeIndex++;
} %>
<%: Html.SubmitButton("Click meh!") %>
<% } %>
</div>
</body>
</html>
示范
[Serializable]
public class ProductViewBinding
{
public object ID { get; set; }
[NonSerialized]
public object _value;
public object Value
{
get { return this._value; }
set { this._value = value; }
}
}
控制器
[HttpPost]
public ActionResult Index([Deserialize] List<ProductViewBinding> Encryption)
{
return View("Index", Encryption);
}
公布,当它返回null ...但如果我删除[反序列化]属性它返回它应该但仍然加密的ID ......什么我可能会做任何建议错了?
It returns null when posted... but if I remove the [Deserialize] attribute it returns as it should but with the ID still encrypted... Any suggestions for what I might be doing wrong?
推荐答案
我认为你缺少的序列化
助手是如何工作的地步。你传递一个整个对象图是序列化,并使用 [反序列化]
属性保存在一个隐藏字段,你可以取回一个控制器动作。你不能有一半的对象序列化,另一半没有。
I think you are missing the point of how the Serialize
helper is supposed to work. You pass it an entire object graph which is serialized and stored in a hidden field that you could get back in a controller action using the [Deserialize]
attribute. You cannot have half of your object serialized and the other half not.
更新:
在这里看到您的评论后一个变通方法:
After seeing your comment here's a workaround:
型号:
public class ProductViewBinding
{
public string ID { get; set; }
public string Value { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new[]
{
new ProductViewBinding { ID = "1", Value = "value 1" },
new ProductViewBinding { ID = "2", Value = "value 2" },
};
return View(model);
}
[HttpPost]
public ActionResult Index(
[Deserialize(SerializationMode.Encrypted)]string[] ids,
string[] values
)
{
IEnumerable<ProductViewBinding> model = values.Zip(
ids, (id, value) => new ProductViewBinding { ID = id, Value = value }
);
return View("Index", model);
}
}
查看:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<SomeNs.Models.ProductViewBinding[]>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Import Namespace="Microsoft.Web.Mvc" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Index</title>
</head>
<body>
<% using (Html.BeginForm()) { %>
<%: Html.Serialize("ids", Model.Select(x => x.ID).ToArray(), SerializationMode.Encrypted) %>
<%for (int i = 0; i < Model.Length; i++) { %>
<%: Html.TextBox("Values[" + i + "]", Model[i].Value) %>
<% } %>
<%: Html.SubmitButton("Click meh!") %>
<% } %>
</body>
</html>
注意 SerializationMode.Encrypted
标志,如果你想实现加密所使用,否则用户可以通过篡改值
Notice the SerializationMode.Encrypted
flag which is used if you want to achieve encryption, otherwise the user can tamper with the values.
这篇关于ASP.NET MVC - 序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!