これは私の質問へのフォローアップです: 「置換パラメーター」が空の文字列に変換されるのはなぜですか?
わかりました、誰かがここで何が起こっているのかを理解するのを手伝ってくれるかもしれません (私がこのコードを書いていないことに注意してください。したがって、なじみのない地形にヘリで投下されたばかりの問題クマの観点からアプローチしています)。
そうすることがより自然で慣習的であるように思われたので、ハンドラーを送信ボタンのクリック ハンドラーからフォームの送信ハンドラーに変更しました。
$("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);