【问题标题】:ASP.NET MVC - Return dictionary parametersASP.NET MVC - 返回字典参数
【发布时间】:2010-08-29 19:44:53
【问题描述】:

好的,我正在尝试向我的视图传递一个字典,其中 key = int,value = Prototype。

原型:

public class Prototype     
{
    public string Value { get; set; }
    public string PropertyName { get; set; }
    public Options Type { get; set; }
}

字典传入我的视图后,我正在执行一个 foreach 循环来渲染每个 KeyValuePair:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Dictionary<System.Int32,MvcApplication1.Models.Prototype>>" %>
<%@ Import Namespace="SecuredFormExample.Code" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Index</title>
</head>
<body>
    <div>

    <% Html.BeginForm("Save", "Products", FormMethod.Post); %>

    <% foreach (KeyValuePair<int, Prototype> p in Model)
       { %>
       <%: Html.Label(p.Value.PropertyName) %>
       <%: Html.TextBox("Value") %>
       <% } %>
    <p><input type="submit" value="submit" /></p>

    <% Html.EndForm(); %>

    </div>
</body>
</html>

现在的问题是,是否可以将 KeyValuePair 值部分中的其他值也传递回操作,还是我需要将它们全部放入隐藏字段中?

【问题讨论】:

  • 我们可以做的更详细一点,目前还不清楚您要做什么。
  • 帖子更新了更多细节。
  • 是的,我在这里和安迪在一起,如果我解释一下 - 您试图返回一组键值对作为对 GET 或 POST 的响应?我想一些要回答的问题是 a) 扩展你正在尝试做的事情 b) 告诉我们更多关于你已经尝试过的事情。听起来你正在做类似 AJAX 的事情。告诉我们更多...

标签: asp.net-mvc http-post


【解决方案1】:

如果您想将值返回到您发布到的操作中,您需要将它们与请求一起发送。使用隐藏字段是一种方法。另一种方法是仅发送一个标识符,该标识符允许您在要发布到的控制器操作中从存储库中获取这些值,就像您在呈现表单的控制器操作中执行此操作一样。

如果您担心用户篡改隐藏字段,您可以使用Html.Serialize 序列化和加密整个对象。


更新:

这是一个扩展我的第二个命题的示例,即使用 id:

<% Html.BeginForm("Save", "Products", FormMethod.Post) { %>
    <%: Html.Hidden("id", "PUT AN ID HERE WHICH IDENTIFIES THE ITEM")
    <% foreach (KeyValuePair<int, Prototype> p in Model) { %>
       <%: Html.Label(p.Value.PropertyName) %>
       <%: Html.TextBox("Value") %>
    <% } %>
    <p><input type="submit" value="submit" /></p>
<% } %>

在你的控制器动作中:

public ActionResult Save(string id, ....) 
{
    var data = SomeRepository.FetchData(id);
    ...
}

【讨论】:

  • 隐藏字段似乎是 risci,因为用户可以更改该值。我已经阅读了有关加密隐藏字段和盐的信息。但我发现的两个例子都被破坏了,我没有太好了,我可以为此编写自己的 HtmlHelper .. 那么另一种方法是什么?
  • 我不确定我是否明白你所说的只发送标识符是什么意思,你能举个例子吗?
  • 您之前提到的 Serialize 扩展是 ASP.NET MVC 2 期货程序集的一部分 - 这是否意味着它“正在开发中”还是现在可以使用?
  • 它可以使用,它只是不是核心构建的一部分。我已经在多个项目中使用它,没有任何问题。 Futures 程序集中的许多有用的扩展都包含在 ASP.NET MVC 2 构建中。
  • 尝试重建并运行项目。这可能是 Intellisense 没有显示它们的错误。您也可以尝试使用视图顶部的 Import 指令:&lt;%@ Import Namespace="Microsoft.Web.Mvc" %&gt;
【解决方案2】:

刚刚看到您的更新,您的选项仅受 HTML 和浏览器功能的限制,因此隐藏字段之类的内容在这里看起来很自然。其他选择(例如脚本)也可以使用,但比隐藏字段的自动行为要复杂得多。

MVC Futures 显示一般路径在哪里。它有一堆 HtmlHelper 扩展来生成隐藏字段并将对象状态编码到这些字段中。当然,您可能有额外的要求,例如防篡改等,您可以在这些方法之上进行分层。

http://aspnet.codeplex.com/SourceControl/changeset/view/55373#338518

  • BinaryHtmlExtensions.cs
  • ExpressionInputExtensions.cs

实际上,这些将被视为老式 ViewState,您可以在其中通过解码这些字段来重构控制器中的模型状态。

【讨论】:

    【解决方案3】:

    在 ASP.NET MVC 中将不可见值从一页传递到下一页的选项有:-

    1) 隐藏字段(加密或其他)

    2) Cookies(隐藏或其他)

    3) Url 参数(编码或其他,大小有限)

    4) 会话状态(用大对象填充通常不是一个好主意)

    5) TempData(类似于会话状态,但只持续一个“周期”)

    6) 数据库(只需传递一个键,以便您可以在下一页检索数据)

    对于此示例,如果您的数据不是太大并且您不在负载平衡的 Web Farm 上,我建议将TempData 作为最简单的解决方案。 (如果您在负载平衡的场中,您仍然可以这样做,但您可能需要更改会话状态的处理方式)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2013-05-29
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多