我正在教自己MVC,我正在努力找出解决问题的最佳方法。我有一个包含大量输入字段的搜索控制器。我还将有多个搜索字段的重载,例如基本搜索高级搜索searchByCategory等。
发布搜索表单时,我会重定向到另一个显示搜索结果的操作。如果我按f5,则再次触发get动作,而不是在我的帖子重定向到的动作中刷新的搜索结果。理想情况下,我想在不使用查询字符串的情况下重定向到搜索结果Action Method
,或检测何时刷新并重新查询数据库并在同一搜索控制器中使用不同的操作。我已经阅读了很多关于此的帖子,我能找到的唯一两个解决方案是使用会话变量或TempData.Can任何人都建议什么是最佳实践
答案 0 :(得分:4)
来自评论
大多数情况下,我更愿意使用TempData
代替QueryString
。这样可以保持网址清洁。
<强>问题强>
任何人都可以建议什么是最佳做法
<强>答案强>
数据发送到Action Method
后从数据库中获取结果根据我的知识,您可以使用TempData
来存储发布的数据。它就像一个DataReader
类,一旦读取,数据就会丢失。因此TempData
中存储的数据将变为空。
var Value = TempData["keyName"] //Once read, data will be lost
因此,即使在读取数据后仍然保留数据,您可以像下面那样使用它
var Value = TempData["keyName"];
TempData.Keep(); //Data will not be lost for all Keys
TempData.Keep("keyName"); //Data will not be lost for this Key
TempData
也适用于新的标签/ Windows,例如Session
变量。
您也可以使用Session
变量,唯一的问题是Session
变量与TempData
相比非常重。最后,您还可以在控制器/区域之间保留数据。
希望这篇文章可以帮到你。
答案 1 :(得分:0)
我认为在执行搜索之后甚至不需要调用Get Method
,尽管如果您在数据库中执行任何添加/更新/删除操作,这是一个好习惯。但在您的情况下,您只需从post方法返回View
即可,无需在tempdata
或session
中存储数据,直到您真的不再需要它们为止。所以做这样的事情:
[HttpPost]
public virtual ActionResult PerformSearch(SearchModel model)
{
// Your code to perform search
return View(model);
}
希望这会有所帮助。
答案 2 :(得分:0)
嗨谢谢
我有机会重温这一点。问题是我忽略了我提到我使用jQuery mobile
默认情况下使用Ajax,即使是普通的Html.BeginForm
。我还返回了一个视图,我已经学会了不会更新URL但只为当前控制器渲染新的html。我的解决方案是在Html.Beginform
中设置action,controller和html属性,如下所示:
@Html.BeginForm("Index", "SearchResults", FormMethod.Post, new { data_ajax = "false" })
在searchResults控制器的索引操作的参数内我有一个viewModel
,表示我发布的表单的fieldset
。 data-ajax="false"
禁用表单帖子上的Ajax,MVC负责将表单post参数匹配到我的模型。这允许url
更新,当我按f5刷新控制器重新查询数据库并更新搜索结果时。
感谢大家的帮助。我知道TempData
但很高兴知道这比会话数据更受欢迎所以我投了你的答案