【问题标题】:ASP.NET MVC - SerializableASP.NET MVC - 可序列化
【发布时间】:2011-04-06 05:07:12
【问题描述】:

我正在尝试使用来自后续程序集的新 Html 帮助程序扩展 Serialize()..

如果你看看:

查看

<%@ 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...但是如果我删除 [Deserialize] 属性,它会按原样返回但 ID 仍然加密...关于我可能做错的任何建议?

【问题讨论】:

    标签: asp.net-mvc serialization serializable


    【解决方案1】:

    我认为您错过了 Serialize 助手应该如何工作的重点。您将整个对象图传递给它,该对象图被序列化并存储在一个隐藏字段中,您可以使用[Deserialize] 属性在控制器操作中返回该隐藏字段。您不能将对象的一半序列化而另一半不序列化。


    更新:

    看到您的评论后,这里有一个解决方法:

    型号:

    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标志,否则用户可以篡改这些值。

    【讨论】:

    • 我明白了。但是将密钥加密到隐藏字段中的正确方法是什么,该隐藏字段用于在列表时识别文本框?如果它有效,我试图做的事情将是理想的。因为我只需要序列化 ​​ID 字段,而不是文本框(值)......
    • 效果很好! - 但是用户仍然可以篡改这些值?
    • 不,他们无法篡改 IDS,因为它们是加密的。如果有人篡改了值,您将在控制器操作中获得 null 或异常,但用户将无法修改值。
    • 如果我为“ids”编辑生成的隐藏字段的值,它会返回“base-64 char 数组的无效长度”,如果我只是将另一个序列化字段的值复制到“ids” " 值然后它被接受?
    • 是的,您应该将它们合二为一。
    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多