6

我在 MVC3 应用程序上有一个组合框。选择新项目时,它会像我想要的那样回到。那里一切都好。在此过程中,我弹出一个查询字符串并在页面加载时读取它。当页面刷新时,它会读取查询字符串并根据需要设置其他控件。

但是,我需要检测页面何时重新加载,它是回发的结果,而不是第一次加载页面。这是因为当页面最初加载时,一切都搞砸了,直到有人从组合框中选择了一些东西。

但是,该站点的新用户不会知道这一点,只会看到一团糟。

我知道 MVC3 应用程序没有与 ASP.Net 相同的 isPostback ,并且由于我不明白的各种原因,我知道它在某种程度上不被认为是“可接受的”。

但是,我只是想知道是否有 100% 保证可靠的方法来区分页面首次加载和以与 ASP.Net 中相同的方式进行的回发。如果有这样的方法,它是什么以及如何实现它。

我看过其他帖子这样做:

    public bool IsPostBack
    {
        get
        {
            return ViewBag.IsPostBack = (Request.HttpMethod == "POST");
        }
    }

但我在其他地方读到这总是正确的。因此,因此,如果这总是正确的,那么在第一次加载时也是如此,因此,我无法可靠地判断它是否是回发。我当然知道这是某种回发。但如果它是第一次加载,则不是。

谁能帮我解答这个问题。此外,我使用的是 Razor 视图引擎,而不是标准的 aspx 视图引擎。

4

3 回答 3

16

在 MVC 中,您通常对 GET 和 POST 有不同的操作:

[HttpGet] // Actions are GET by default, so you can omit this
public ActionResult YourAction(int id)
{
    // GET
}

[HttpPost]
public ActionResult YourAction(YourModel model)
{
    // POST
}

如果您遵循此模式,则无需担心Page.IsPostBack-like 属性。

于 2012-07-03T17:33:18.267 回答
4

正如您所说,在 ASP.NET MVC 中没有 Postback 的概念。你冷做的是测试用于执行请求的 HTTP 动词,看看它是否是 POST。这可能是在表单提交或 AJAX 请求之后:

public ActionResult Foo()
{
    if (string.Equals("post", Request.HttpMethod, StringComparison.OrdinalIgnoreCase)
    {
        // The POST verb was used to invoke the controller action
    }
    ...
}
于 2012-07-03T17:27:59.437 回答
3

您可以使用适当的属性来装饰动作

[HttpGet]
public ActionResult Foo() { 
    //Do pre-postback stuff here 
}

[HttpPost]
public ActionResult Foo() { 
    //Do postback stuff here 
}
于 2012-07-03T17:33:05.157 回答