私は知っている、私は知っている、私は知っている。 MVC内でWebフォームを作成するべきではありません。完全に同意します。しかし、私の給料に署名する人々は、今のところ私たちのサイトのMVCへの完全な変換を承認しません。そのため、MVCに新しい機能を追加しながら、それらを変換するために、ページごとに段階的な手順を実行しています。
だから私の質問は、コントローラーからIsPostBackプロパティにアクセスするにはどうすればよいですか?
編集:さらに明確にするために、mvcマスターページにポストバックを開始できるWebフォームユーザーコントロールがあります。私はこれらのポストバックとMVCポストを識別しようとしています。この時点で、リクエストフォームのキーで「__viewstate」キーを確認し、見つかった場合はポストバックとして扱うと思います。
誰かがまだ興味を持っている場合は、次のようなMVCアクションメソッド内からPOSTをテストできます:
if (Request.HttpMethod=="POST") {
}
IsPostBackはありません。すべてがPOSTまたはGET(または他のHTTP動詞)のいずれかです。アクションで許可されるHTTP動詞を制限できます。つまり、AcceptVerbsAttributeを使用して、許可されていない動詞からのリクエストが表示されることはありません。たとえば、次の例ではPOSTのみが許可されています。
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult Update( int id )
{
}
同じアクション名でGET/POSTの両方を実行する必要があり、実際には異なることを行う場合は、別々の署名を付けるか、ActionNameAttributeを使用してアクションの1つにエイリアスを付け、メソッドに異なる名前を付けることができます。
[AcceptVerbs( HttpVerbs.Get)]
public ActionResult List()
{
}
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult List( string filter, int page, int limit )
{
}
OR
[ActionName( "List" )]
[AcceptVerbs( HttpVerbs.Get)]
public ActionResult ListDisplay()
{
}
[AcceptVerbs( HttpVerbs.Post )]
[ValidateAntiForgeryToken]
public ActionResult List()
{
}
[〜#〜] edit [〜#〜]:POSTアクションに偽造防止トークンの検証を追加したことに注意してください。あなたは本当にこれを クロスサイトスクリプティング攻撃から保護する に使用するべきです。
このコードはRazorで使用できます
@if(IsPost)
{
//dosomething
}
else
{
//do some other thing
}
私はよくこのメソッドを使用します(BaseControllerクラスで宣言されています)
protected bool IsPostBack()
{
bool isPost = string.Compare(Request.HttpMethod, "POST",
StringComparison.CurrentCultureIgnoreCase) == 0;
if (Request.UrlReferrer == null) return false;
bool isSameUrl = string.Compare(Request.Url.AbsolutePath,
Request.UrlReferrer.AbsolutePath,
StringComparison.CurrentCultureIgnoreCase) == 0;
return isPost && isSameUrl;
}
コントローラーはSystem.Web.UI.Pageから継承しません。 isPostbackプロパティはありません。
Asp.net Core 2.xの場合、HttpRequestに拡張メソッドを作成できます。 @ibiriteに基づくと、回答は次のようになります。
using System;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
namespace MyApp
{
public static class HttpRequestExtensions
{
public static bool IsPostBack(this HttpRequest request)
{
var currentUrl = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
var referrer = request.Headers["Referer"].FirstOrDefault();
bool isPost = string.Compare(request.Method, "POST",
StringComparison.CurrentCultureIgnoreCase) == 0;
if (referrer == null) return false;
bool isSameUrl = string.Compare(currentUrl,
referrer,
StringComparison.CurrentCultureIgnoreCase) == 0;
return isPost && isSameUrl;
}
}
}
MVCフレームワークは、Webフォームで使用される従来のポストバックとビューステートをサポートしていません。したがって、いいえ、IsPostBackにアクセスすることはできません。
私からのアドバイスは、2つのブランチを用意することです。1つは既知のエラーのパッチを追加する現在のサイトで、もう1つは新しいサイトを最初から構築するブランチです。これには新しい機能を実装する必要があります。あなたのコードベースのほとんどは新しいサイトで再利用できると思います。
新しいサイトの準備ができたら、本番環境に配置します。
なぜコントローラー内からその値を取得しようとしているのですか?これが役立つかどうかはわかりませんが、従来のRequestオブジェクトを使用して、フォームから送信された情報を取得できます...
あなたの質問を正しく理解したかどうかはわかりませんが、コントローラーには、ブラウザーからの最初のGETを処理するアクションと、POSTを処理する2番目のアクションがあります。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(MyModel model)
{...}
public ActionResult Create()
{...}
MVCページに複数のフォームがある場合は、意味のあるIDを使用してフォーム内に非表示の入力を追加し、値があるかどうかをテストできます。このように、2つの別々のハンドラー(1つはget用、もう1つはpost用)を持つ必要はありません。
したがって、ページとフォーム内にinfを入力します。
<input type="hidden" id="testForm" name="testForm" value="1"/>
そしてコントローラーで:
if (Request.Form["testForm"] != null)
{
// ACTIONS FOR THE POSTED FORM
}
それが役に立てば幸い!
スコット・ハンゼルマンがMVCアプリケーションにaspxページを配置したこのブログ投稿をぜひご覧ください。
コントローラはViewStateプロパティにアクセスできません。 __VIEWSTATEの問題を処理したい場合でも、mvcコントローラーで使用可能な形式にするためにいくつかの作業を行う必要があります。変換戦略を考え出すことで幸運を祈ります。それがどのようにうまくいくとしても、多くの人々はあなたがその過程で直面するであろう問題の種類を知りたいと思うでしょう。