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引用自 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);
4

1 回答 1

1

Clay,您需要确保在填充模型后控制器实际将值传递给视图。您应该会看到如下内容:

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 Pipeline

干杯。

于 2013-08-21T21:47:26.587 回答