我在MVC3应用程序上有一个组合框。当选择一个新项目时,它会根据我的要求发回一个帖子。一切都很好。在这个过程中,我弹出一个查询字符串并在页面加载时读取它。当页面刷新时,它会读取查询字符串并根据需要设置其他控件。
但是,我需要检测页面何时重新加载,它是由于回发的结果,而不是第一次加载页面。这是因为当页面最初加载时,一切都搞砸了,直到有人从组合框中选择了一些内容。
然而,该网站的新用户不会知道这一点,只会看到一团糟。
据我所知,MVC3应用程序与ASP.Net没有相同的isPostback,并且出于各种原因我不明白,我知道它不会被认为是“无法接受的”。
但是,我只是想知道是否有100%保证可靠的方法来区分页面首次加载和回发方式,与ASP.Net中的方式相同。如果有这样的方式,它是什么以及如何实现它。
我看过其他帖子就是这样做的:
public bool IsPostBack
{
get
{
return ViewBag.IsPostBack = (Request.HttpMethod == "POST");
}
}
但我读到其他地方,这是永远的。因此,如果这始终是真的,那么在第一次加载时也是如此,因此,我无法可靠地判断它是否是回发。我当然知道这是某种回发。但它不是第一次加载。
任何人都可以帮我解决这个问题。此外,我使用Razor视图引擎而不是标准的aspx视图引擎。
答案 0 :(得分:15)
在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
的财产。
答案 1 :(得分: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
}
...
}
答案 2 :(得分:3)
您可以使用适当的属性
修饰动作[HttpGet]
public ActionResult Foo() {
//Do pre-postback stuff here
}
[HttpPost]
public ActionResult Foo() {
//Do postback stuff here
}