如何取消ASP.NET MVC操作

时间:2009-05-12 20:21:56

标签: asp.net-mvc vb.net model-view-controller

这应该很简单,但答案是躲避我。如果我的控制器中有一个保存操作,并且保存失败,如何在不干扰用户输入的情况下取消操作?例如,索引是强类型的“MyTable”:

Function Index() As ActionResult
    ViewData("message") = "Hello"
    Return View(New MyTable)
End Function

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _
Function Save(ByVal form As MyTable) As ActionResult
    Try
        SaveMyData(form)
        Return RedirectToAction("Index")
    Catch
        AddModelError("form", "An error occurred.")
        ???
    End Try
End Function

在Catch中,如果我放回Return View(表单),我将丢失通过ViewData传递的消息。如果我重定向到索引,我将失去用户输入的内容。我想我之前已经看到了处理这个问题的简单(正确)方法,但如果你不知道要搜索什么,就很难找到。我错过了什么?

3 个答案:

答案 0 :(得分:1)

您不需要显式地存储表单值,因为它们由框架保留。

更换“????”使用以下内容将提醒您的视图错误(通过ModelState属性)以及重新显示输入的值:

Return View(form)

答案 1 :(得分:1)

  

在Catch中,如果我放回Return View(表单),我将丢失通过ViewData传递的消息。

根据我的理解,您不会丢失通过ViewData传递的消息 - 该功能根本无法运行。

我强烈建议不要进行重定向或使用TempData来实现你想要实现的目标,其中没有任何意义,也不是MVC的工作方式。

继续你得到的东西我会有一个私有函数,两个动作都会调用它来返回视图。它在一个地方有你的ViewData(“消息”),你仍然拥有表格中的先前值(和像Josh E说的那样在ModelState内)。

警告:来自C#程序员的VB.NET空气代码; - )

Function Index() As ActionResult
    Return IndexView(New MyTable)
End Function

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _
Function Save(ByVal form As MyTable) As ActionResult
    Try
        SaveMyData(form)
        Return RedirectToAction("Index")
    Catch
        AddModelError("form", "An error occurred.")
    End Try

    Return IndexView(form)
End Function

Private Function IndexView(ByVal form As MyTable) As ActionResult
    ViewData("message") = "Hello"
    Return View(form)
End Function

HTHS, 查尔斯

聚苯乙烯。我想补充一点,我觉得很奇怪你有一个回复自己的索引页面然后如果帖子有错误它重新显示索引页面但是如果没有任何错误它重定向回索引页面

我不知道应用程序正在做什么,但看起来你似乎正在使用索引页面/视图进行太多的事情。

答案 2 :(得分:0)

您可以使用TempData在重定向期间存储表单中的数据,并在Index操作中从TempData获取数据。这是一个discussion of TempData

您的行为将如下(请原谅我对VB.Net语法的二年级知识):

Function Index() As ActionResult
    ViewData("message") = "Hello"

    If TempData["FormData"] == Nothing
        Return View(New MyTable)
    Else
        Return View(TempData["FormData"])
    EndIf
End Function

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _
Function Save(ByVal form As MyTable) As ActionResult
    Try
        SaveMyData(form)
    Catch
        AddModelError("form", "An error occurred.")
        TempData["FormData"] = form;
    End Try

    Return RedirectToAction("Index")
End Function

TempData将存储来自同一主机的一个请求的数据。它与Rails中的 flash 功能几乎相同。

相关问题