0

これは私の質問へのフォローアップです: 「置換パラメーター」が空の文字列に変換されるのはなぜですか?

わかりました、誰かがここで何が起こっているのかを理解するのを手伝ってくれるかもしれません (私がこのコードを書いていないことに注意してください。したがって、なじみのない地形にヘリで投下されたばかりの問題クマの観点からアプローチしています)。

そうすることがより自然で慣習的であるように思われたので、ハンドラーを送信ボタンのクリック ハンドラーからフォームの送信ハンドラーに変更しました。

$("form").submit(function () {

空の文字列 (GUID、SerialNumber、および ReportName) に解決されているため、プロセス全体が失敗する原因となっているモデル値は、対応するモデルの基本クラスで宣言されています。

public class ReportModelCore
{
    public string GUID { get; set; }
    public string SerialNumber { get; set; }
    public string ReportName { get; set; }
    public bool DataSourceSuccess { get; set; }
    public string DataSourceMessage { get; set; }
    public string message { get; set; }
}

...そして、これらのコア メンバーには、コントローラーで条件付きで値が割り当てられます。

model.SerialNumber = Serial.ToString();
model.ReportName = "ReceiptCollection";

DatasourceCreatorResultContract result = Operations.CreateDataSource(criteria);

if (result.type == ResultType.Success)
{
    model.GUID = result.GUID;
    . . .
}
else if (result.type == ResultType.SuccessWithAlert)
{
    model.GUID = result.GUID;
    . . .
}
else // Failure < no GUID assigned in diesem Fall
{
    . . .

...しかし、それらが参照されるフォームの送信ハンドラーに値があると予想される方法については理解していません。

    . . .
    if (resultsText == "0") {
        $("#NumberOfResults").css("color", "red");
    } else {
        var href = '/@ConfigurationManager.AppSettings["ThisApp"]/TLDCriteria/LoadReport';
        // report_parms (sic) is referenced from LoadReport
        var report_parms = {
            GUID: "@Model.GUID",
            SerialNumber: "@Model.SerialNumber",
            ReportName: "@Model.ReportName"
        };
        window.open(href, "report_window", "resizable=1, width=850, left=" + (screen.width / 2 - 425));
    }
. . .

IOW: コントローラの [HttpPost] ActionResult はいつ発火しますか? フォーム送信イベントが終了する前に? もしそうなら、正確にはいつですか?

そうでない場合、なぜこのコードはまだ値を割り当てることができなかったモデル メンバーを参照しているのですか (現在のように空の文字列の場合、キット全体と kaboodle が厳粛に、しかし無知に失敗します)。

アップデート

report_parmsは、コメント ノートにあるように、Silverlight に感染したファイルである LoadReport から参照されます。

<script type="text/javascript">
    function get_user_name() {
        return "@User.Identity.Name";
    }

    function get_xml_data() {
        return window.opener.xml_data;
    }

    function get_receipt_parms() {
        return window.opener.receipt_parms;
    }

    function get_report_parms() {
        return window.opener.report_parms;
    }
</script>

Firefox > Script でステップ実行すると、"report_parms" のこれら 3 つのメンバーの値が空の文字列であることが実際に示されます。私は驚いていませんが、繰り返しになりますが、この時点でこれらの val が入力されることを誰かが期待する理由はありますか? また、そうする必要がありますか? もしそうなら、どのように?

更新 2

ジェームスさん

はい、あります:

return View(model);

... [HttpPost] ActionResult の最後ですが、到達していないことがわかりました。どうやら別の問題が発生を妨げているようです。実際、それは一種の「鶏と卵」の問題のように思えます: 私はこのコードの理由を考えていました:

DatasourceCreatorResultContract result = Operations.CreateDataSource(criteria);

...失敗したのは、CreateDataSource() に渡された基準オブジェクトが正しくなかったためでした。それは、それらの report_parms が空だったためです。しかし、OTOH、問題は別のところにあるのかもしれません。つまり、「if (result.type == ResultType.Success)」行には到達しません。これは、明らかに適切な認証がないためにコードが失敗するためです。

これは自分の report_parms の問題が原因だと思っていましたが、おそらく私の report_parms の問題はこれが原因です!

コードのセクション全体は次のとおりです。

        . . .
    model.SerialNumber = Serial.ToString();
    model.ReportName = "ReceiptCollection";

    DatasourceCreatorResultContract result = Operations.CreateDataSource(criteria);

    if (result.type == ResultType.Success) // <-- this is not reached; "conn.Open();" in another class fails before it can be
    {
        model.GUID = result.GUID;
        model.DataSourceSuccess = true;
        model.NumberOfResults = result.Count;
        model.message = String.Format("{0} results", result.Count);
    }
    else if (result.type == ResultType.SuccessWithAlert)
    {
        model.GUID = result.GUID;
        model.DataSourceSuccess = true;
        model.NumberOfResults = result.Count;
        model.message = result.Message;
    }
    else // Failure
    {
        model.DataSourceMessage = result.Message;
        model.DataSourceSuccess = false;
        model.NumberOfResults = 0;
        model.message = result.Message;
    }
}
return View(model);
4

1 に答える 1

1

粘土、モデルにデータを入力した後、コントローラーが実際に値をビューに渡すことを確認する必要があります。次のように表示されます。

return View(model);

ビューはそのモデルに型付けされているため (他の質問から見た)、モデルを View メソッドに渡すと、実際にはフレームワークにビューを構築するときにそのデータ セットを操作するように指示します。

これのいくつかは魔法のように見えることに同意しますが、これらは単なるクラスとメソッドであることを覚えておいてください. コントローラーは、「View」というメソッドを持つ基本コントローラーから継承します。ここで行っているのは、そのメソッドにオブジェクトを渡すことです。次に、オブジェクトを Razor ビュー エンジンに挿入して結果 (レンダリングされてブラウザーに返される HTML ページ) を生成します。

あなたの質問に対して、フォームの送信 (クライアントで発生) と ActionResult の呼び出し (サーバーで発生) は、Web ブラウザーが要求を行い、結果に注意を払うことによってのみ接続されます。フォームは、ブラウザのリクエストの一部として完全に送信されます。このメソッドは、サーバーが完全なリクエストを受信する (そしてコントローラーのインスタンスを作成するなど) まで呼び出されません。

典型的な Asp.Net MVC フローは次のようになります。

  1. ブラウザーの要求により、ActionResult メソッドが呼び出されます。フォームなので、おそらくビュー モデルをロードしてビューに渡します。
  2. ビューは Razor ビュー エンジンによって処理されます。渡されたモデルはエンジンに提供され、ビュー全体で使用されます。
  3. ブラウザ (erm...user) がフォームを送信します。値はリクエスト オブジェクトに入れられ、フォームがエンコードされます。
  4. MVC フレームワークが再びスピンアップし、コントローラーを作成し、モデル バインディングを使用してフォーム エンコードされた値をパラメーターにプッシュし (可能な場合)、HttpPost メソッドを呼び出します。

手順 2 でビュー (HTML の結果ページ) に値が表示されない場合は、手順 1 でブレークポイントを設定して、モデルが入力されていない理由を評価することをお勧めします。

これが役立つことを願っています。パイプラインのより詳細なビューが必要な場合は、この投稿をチェックできます: Asp.Net MVC パイプライン

乾杯。

于 2013-08-21T21:47:26.587 に答える