我想知道在ASP.NET MVC中解决这个问题的最佳方法是什么。以下是我希望能够做到的一个简单的例子:
我有一个带有文本框和提交按钮的网页。按下提交按钮时,我希望内容显示在同一网页上。当再次按下时,我希望显示第一次提交时已显示的内容以及刚刚提交的新数据。
我已尝试将此数据保存到模型中,但每次表单发布时都会擦除模型。我怎么能这样做并保留最后一个帖子之前的帖子(以及之前的帖子)?
答案 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对于这种情况,我更喜欢使用隐藏字段,因为它具有较低的复杂性,并且其数据不需要是安全的,因为无论如何它都会显示给用户。