这是我的问题的后续行动:为什么我的“替换参数”被转换为空字符串?
好的,也许有人可以帮助我理解这里发生了什么(请注意,我没有编写此代码,所以我是从刚刚被直升机降落到陌生地形的问题熊的角度来处理它)。
由于这样做似乎更自然/更传统,我将处理程序从提交按钮单击处理程序更改为表单的提交处理程序:
$("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引用自 LoadReport,这是一个 Silverlight 感染的文件,其中包含:
<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”的这三个成员的值是空字符串;我并不感到惊讶,但又一次:有人期望在这一点上填充这些 val是否有理由- 他们需要吗?如果是这样,怎么做?
更新 2
詹姆斯先生,
是的,有一个:
return View(model);
...在 [HttpPost] ActionResult 的末尾,但事实证明它从未到达;显然另一个问题是阻止这种情况发生;acutally,这似乎是一种“鸡和蛋”的问题:我在想这段代码的原因:
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);