通过多个表单POST保留数据

时间:2012-05-18 23:52:41

标签: c# asp.net asp.net-mvc

我想知道在ASP.NET MVC中解决这个问题的最佳方法是什么。以下是我希望能够做到的一个简单的例子:

我有一个带有文本框和提交按钮的网页。按下提交按钮时,我希望内容显示在同一网页上。当再次按下时,我希望显示第一次提交时已显示的内容以及刚刚提交的新数据。

我已尝试将此数据保存到模型中,但每次表单发布时都会擦除模型。我怎么能这样做并保留最后一个帖子之前的帖子(以及之前的帖子)?

2 个答案:

答案 0 :(得分:3)

如果您希望数据在请求之间保持不变,那么我将使用'TempData'作为起点。 TempData属性值存储在会话状态中,直到读取或会话到期为止。

示例ViewModel:

    public class SomeClass
    {
        public string Something { get; set; }
        public List<string> RetainedValues { get; set; } 
    }

示例控制器:

    [HttpGet]
    public ActionResult Index()
    {
        return View("Index");
    }

    [HttpPost]
    public ActionResult Index(SomeClass postedValues)
    {
        // retrieve retained values
        var retained = (List<string>) TempData["RetainedValues"] ?? new List<string>();
        retained.Add(postedValues.Something);

        // save for next post
        TempData["RetainedValues"] = retained;

        // setup viewmodel
        var model = new SomeClass
        {
            RetainedValues = retained
        };

        return View("Index", model);
    }

示例视图(强类型):

    <div>
        @foreach(var item in Model.RetainedValues)
        {
            <div>@item</div>
        }
    </div>
    @using(Html.BeginForm())
    {
        @Html.EditorFor(m=>m.Something)
        <input type="submit"/>
    }

答案 1 :(得分:1)

只需为您的模型属性设置隐藏字段,然后将预览值加载到其上并将其传递回下一篇文章。

例:@Html.HiddenFor(model => model.YourProperty)

因此知道你可以有两个属性:一个名为newValue,另一个名为allValues。

你使用隐藏字段的newValues和用于插入新字段的newValue。所以在帖子上你只需要将newValue添加到allValues。

这样的事情:  model.allValues + = newValue;

- 的更新

或者您可以使用@Jesse

中提到的session或tempdata

对于这种情况,我更喜欢使用隐藏字段,因为它具有较低的复杂性,并且其数据不需要是安全的,因为无论如何它都会显示给用户。