【问题标题】:MVC 5 ASP.NET Json result passing parameter as nullMVC 5 ASP.NET Json 结果传递参数为空
【发布时间】:2018-02-16 20:22:42
【问题描述】:

我正在尝试从以前的下拉列表中过滤我的下拉列表,但 json 将结果作为 null 传递。在调试的 jquery 中,它显示 businessunitCd 和 facilityCd 的值,但在控制器中显示为 null。

当我尝试调试时,它说我的 SQLPersistor 在这行 SqlDataReader dr = cmd.ExecuteReader(); 上有一个错误,并且一个错误说

他们找不到@FAC_CD

我的控制器:

public JsonResult GetProcessShown(string businessUnitCd, string facilityCd)
    {
        IEnumerable<SelectListItem> processListItems = new List<SelectListItem>();
        SQLPersistor p = new SQLPersistor(EADConnString);

        List<ProcessShown> processes = p.GetProcessShown(businessUnitCd, facilityCd);

        ProcessShown defaultProcessShown = new ProcessShown();
        defaultProcessShown.ProcessCd = string.Empty;
        defaultProcessShown.ProcessDesc = "Select Process...";

        processes.Insert(0, defaultProcessShown);

        processListItems = (from pr in processes
                             select new SelectListItem
                             {
                                 Text = pr.ProcessDesc,
                                 Value = pr.ProcessCd
                             });

        return Json(processListItems, JsonRequestBehavior.AllowGet);
    }

我的 SQLPersistor:

 public List<ProcessShown> GetProcessShown(string businessUnitCd, string facilityCd)
    {
        List<ProcessShown> Processes = new List<ProcessShown>();

        if (businessUnitCd != string.Empty && facilityCd != string.Empty)
        {
            using (SqlConnection cnn = new SqlConnection(connString))
            {
                cnn.Open();

                string sql = "[Environmental].[GetProcessShown]";


                using (SqlCommand cmd = new SqlCommand(sql, cnn))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@BUSUNIT", SqlDbType.VarChar).Value = businessUnitCd;
                    cmd.Parameters.Add("@FAC_CD", SqlDbType.VarChar).Value = facilityCd;
                    SqlDataReader dr = cmd.ExecuteReader();

                    using (DataTable dt = new DataTable())
                    {
                        dt.Load(dr);

                        foreach (DataRow row in dt.Rows)
                        {
                            ProcessShown ps = new ProcessShown(row["PROCESS_CD"].ToString(), !Convert.IsDBNull(row["PROCESS_NAME"]) ? row["PROCESS_NAME"].ToString() : string.Empty);

                            Processes.Add(ps);
                        }
                    }
                }
            }
        }

        return Processes;
    }

我的 jquery:

 $("#Facility").change(function () {
    $("#ProcessShown").empty();
    $("#Aspects").empty();
    $("#AspectsCategory").empty();
    $("#Activity").empty();
    //document.getElementById("OnCallContactMessage").style.display = "none";

    // Incase theyve double clicked a cause and changed their mind
    document.getElementById("BusinessUnit").required = true;
    document.getElementById("Facility").required = true;
    document.getElementById("ProcessShown").required = true;
    document.getElementById("Aspects").required = true;
    document.getElementById("AspectCategoryDiv").required = true;
    document.getElementById("ActivityName").required = true;

    var ProcessOptions = {};
    ProcessOptions.url = $("ProcessDiv").data('url');
    ProcessOptions.type = "POST";
    ProcessOptions.data = JSON.stringify({ businessUnitCd: $("#BusinessUnit").val(), facilityCd: $("#Facility").val() });
    ProcessOptions.datatype = "json";
    ProcessOptions.contentType = "application/json";
    ProcessOptions.success = function (processes) {
        if (processes.length > 0) {
            for (var i = 0; i < processes.length; i++) {
                $("#ProcessShown").append(new Option(processes[i].Text, processes[i].Value));
            }
        }
    };
    ProcessOptions.error = function () { alert("Error occurred while getting Processes.") };
    $.ajax(ProcessOptions);
});

我的看法:

                @* Processes Shown - Dropdown *@
            <div class="row" style="padding-top:10px">
                <div class="col-xs-3" style="padding-top:8px">
                    @Html.LabelFor(model => model.ProcessShown, new { @class = "group-label" })
                </div>
                <div class="col-xs-8" id="ProcessDiv" data-url="@Url.Action("GetProcessShown", "Aspects")">
                    @Html.DropDownListFor(model => model.ProcessShown, Model.ProcessList, new { @class = "form-control req-field", @required = "required" })
                </div>
            </div>

我的存储过程:

ALTER PROCEDURE [Environmental].[GetProcessShown]
@FAC_CD VarChar(255),
@BUSUNIT VarChar(255)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT CDTBL_PROCESSES.PROCESS_CD, PROCESS_NAME
    FROM(SELECT DISTINCT PROCESS_CD FROM ENVIRN_BU_PROCESS_FAC WHERE FAC_CD = @FAC_CD AND BUS_UNIT_CD = @BUSUNIT) PROCESSES 
    JOIN CDTBL_PROCESSES
    ON CDTBL_PROCESSES.PROCESS_CD = PROCESSES.PROCESS_CD 
    AND OBSLT_EST IS NULL
END

编辑: 如果有帮助,调试时显示的错误是

【问题讨论】:

  • [HttpPost] 属性添加到控制器有帮助吗?
  • @LennartStoop 嗯!?为什么是 [HttpPost]? OP 正在“获取”资源。
  • @TezWingfield 我可能有点困,但 ajax 请求明确指出 ProcessOptions.type = "POST"
  • @LennartStoop 我可能有点困了哈哈。我专注于 C#,touché
  • 我试过 [HttpPost] 但没有用。 @LennartStoop

标签: c# jquery sql json asp.net-mvc


【解决方案1】:

使用stored procedure时,参数的顺序很重要

您的 SP 第一个参数是 @FAC_CD。所以你应该改变cmd.Parameters.Add 参数的顺序。

像这样

cmd.Parameters.Add("@FAC_CD", SqlDbType.VarChar).Value = facilityCd;
cmd.Parameters.Add("@BUSUNIT", SqlDbType.VarChar).Value = businessUnitCd;

【讨论】:

  • 命名参数可以任意顺序传递!
【解决方案2】:

这很可能是因为您在 ajax.data 部分中传递参数的方式。之前有很多关于这个问题的问题。首先,您可能会看到此链接:

Ajax Post Parameter is Always Null in MVC app

简而言之,尝试以下方法之一:

  • 不要使用 JSON.stringify。只需按原样传递数据,或者
  • 或多或少像这样构造 URL:var targeturl = '@Url.Action("Test", "Controller")?id=' + ID;,使用 GET 方法,或
  • 如果您使用 POST 方法,请将 contentType 更改为 "application/x-www-form-urlencoded"

但是,我已经尝试过您上面的原始代码,完全没有问题。

无论如何,希望它有所帮助。

【讨论】:

  • 我尝试了这些方法,但似乎仍然不起作用。尝试这些方法时,似乎url是问题。
  • 我很好奇,您是否尝试过使用 Fiddler 调用该方法?
【解决方案3】:

您发送的数据实际上是一个复合对象,而不是两个独立的字符串。您可以通过在服务器端创建模型来匹配它:

public class ProcessRequest
{
    public string Facility { get; set; }
    public string BusinessUnit { get; set; }
}

控制器方法签名相应更改,并且必须添加一个 HttpPost 属性,因为您通过 POST 发送 HTTP 请求。

[HttpPost]
public JsonResult GetProcessShown(ProcessRequest requestData) {}

关于Sql异常,在存储过程中作为参数传入NULL值时会触发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多