【问题标题】:Get Value of Property (List<long>) in Post Action in ASP.NET MVC3在 ASP.NET MVC3 的 Post Action 中获取属性 (List<long>) 的值
【发布时间】:2012-05-28 15:52:37
【问题描述】:

这是我的模特:

public class MyModel
{
    public List<long> NeededIds { get; set; }
    public string Name { get; set; }
}

我的控制器:

public ActionResult Create()
{
    MyModel model = new MyModel();
    model.NeededIds = new List<long> { 1, 2, 3, 4 };
    return View(model);
}

[HttpPost]
public ActionResult Create(MyModel model)
{
    string name = model.Name;
    List<long> ids = model.NeededIds;
    return RedirectToAction("Index");
}

并查看:

@model TestMVC.Models.MyModel

@using(Html.BeginForm()) {

<table>
    <thead>
        <tr>
            <th>
                Id
            </th>
        </tr>
    </thead>
    <tbody>
        @foreach(long id in Model.NeededIds) { 
            <tr>
                <td>
                    @id
                </td>
            </tr>
        }
    </tbody>
</table>

@Html.ValidationSummary(true)
<fieldset>
    <legend>MyModel</legend>
    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

我在获取操作中设置了NeededIds,在视图中我可以看到NeededIds。我在发布操作中也需要它,但在发布操作中,NeededIds 始终为空。当我在获取操作中设置属性值时,如何在发布操作中获取属性值?你有什么建议?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

    如果您使用的是布局页面,则不要简单地从布局页面中删除表单标签。

    【讨论】:

      【解决方案2】:

      除了 Yakimych 的回答
      您已将 ID 保持不变.. 这意味着两件事
      1. 可以使用数组代替列表
      2.您可以将 ids 列表/数组保存在 TempData 中,并在 POST 发生时从那里取回它
      你可以这样做 在你的 GET 处理程序中

      TempData.Add("ids",idArray);
      

      在您的 POST 处理程序中

      var idArray = (long[])TempData["ids"];
      

      【讨论】:

      • 这实际上是一种不应使用TempData的情况。见rachelappel.com/…,特别是这部分:Since TempData works this way, you need to know for sure what the next request will be, and redirecting to another view is the only time you can guarantee this。由于您没有在此处执行RedirectToAction 或类似操作,因此您无法保证下一个请求将是什么,并且Ids 确实会丢失。
      • 我认为这里的第一个请求也是 GET 并且同一会话中的下一个请求将被发布.. 所以保存在 TempData 中不会有问题
      • 这点我怎么强调都不过分——你不能保证。无论如何,它很容易打破。如果你想确定,做一个简单的测试。在一个浏览器选项卡中打开页面,在另一个浏览器选项卡中对其他操作执行一系列请求,然后在第一个选项卡中执行 POST 请求。您的TempData 将会丢失。
      【解决方案3】:

      您没有将NeededIds 发布回服务器。为了使它工作,您可以将它们作为隐藏字段添加到表单内的 for 循环中:

      @for (int i = 0; i < Model.NeededIds.Count(); i++) { 
          @Html.HiddenFor(model => model.NeededIds[i])
      }
      

      【讨论】:

      • 这很奇怪,为什么我之前设置的时候又设置了?
      • 这就是 HTTP 的工作方式——它是无状态的。您之前在模型中设置的任何内容都不会在请求之间保留在服务器上。因此,您需要将NeededIds 与模型的其余部分一起发回,否则它们会丢失。
      猜你喜欢
      • 1970-01-01
      • 2013-09-10
      • 2018-08-02
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多