如何从Ajax方法将值传递给控制器​​Action?

时间:2012-08-20 09:39:59

标签: ajax asp.net-mvc-3

大家好我有ajax我有一些数据和控制器动作方法...我需要将数据发送到控制器动作方法...当我这样做时它在我的控制器方法中有空值,可以任何人都纠正我在哪里做的事情......

       <script type="text/javascript">
    $(document).ready(function () {

        $("#butValidateForm").click(function () {               
            UpdateMethod();
        })
    });
    function UpdateMethod() {
        var s = document.getElementById("EmployeeID");
        var selecteditem1 = s.options[s.selectedIndex].value;

        var a = document.getElementById("FromStatusId");
        var selecteditem6 = a.options[a.selectedIndex].value;

        var data = '{"AssignTo":"' + selecteditem1 + '","Status":"' + selecteditem6 + '"}';
        alert(data);

        $.ajax({
            type: "POST",
            url: "/ViewBug/Update/",
            enctype: 'multipart/form-data',
            data: data,
            success: function () {
            }
        });
    }  

</script>

我的控制器操作方法

          [HttpPost]
    public ActionResult Update(BugModel model, FormCollection form, string selecteditem1, string selecteditem6)
    {
        if (Session["CaptureData"] == null)
        {
        }
        else
        {
            model = (BugModel)Session["CaptureData"];
        }
        ViewBag.AssignTo = new SelectList(GetEmployee(), "EmployeeID", "EmployeeName");
        ViewBag.Status = new SelectList(GetFromStatus(), "FromStatusId", "FromStatus");
        using (SqlConnection conn = new SqlConnection(connString))
        {
            SqlCommand cmd = new SqlCommand("sp_history", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            conn.Open();
            cmd.Parameters.Add("@Title", SqlDbType.VarChar).Value = model.Title;
            cmd.Parameters.Add("@FixedById", SqlDbType.VarChar).Value = model.LoginName;
            cmd.Parameters.Add("@AssignedId", SqlDbType.Int).Value = model.AssignTo;
            cmd.Parameters.Add("@Resolution", SqlDbType.VarChar).Value = model.Resolution;
            cmd.Parameters.Add("@FromStatus", SqlDbType.VarChar).Value =model.Status;
            string fileName = string.Empty;
            string StrFilePath = string.Empty;
            foreach (BugAttachment objList in model.ListFile)
            {
                if (string.IsNullOrEmpty(StrFilePath))
                {
                    fileName = objList.AttachmentName;
                    StrFilePath = objList.AttachmentUrl;
                }
                else
                {
                    fileName = fileName + "," + objList.AttachmentName;
                    StrFilePath = StrFilePath + "," + objList.AttachmentUrl;
                }
            }
            cmd.Parameters.Add("@AttachmentName", SqlDbType.VarChar).Value = fileName;
            cmd.Parameters.Add("@BugAttachmentUrl", SqlDbType.VarChar).Value = StrFilePath;
            cmd.Parameters.Add("@AttachedBy", SqlDbType.VarChar).Value = model.LoginName;
            cmd.ExecuteNonQuery();
            conn.Close();
        }
        return View("Edit");
    } 

3 个答案:

答案 0 :(得分:4)

而不是

public ActionResult Update(BugModel model, FormCollection form, string selecteditem1, string selecteditem6)

尝试一下:

public ActionResult Update(BugModel model, FormCollection form, string AssignTo, string Status)

您需要使用您在发送回的对象中使用的属性的名称,因为您已将其命名为AssignTo和Status。希望这会有所帮助。

编辑:

尝试发送这样的对象:

var data ={};
data.AssignTo = selectedvalue1;
data.Status = selectedvalue6;

看看是否有任何区别。如果您仍有问题,可以在firebug /开发人员工具中检查请求吗?

答案 1 :(得分:4)

试试这个:

var data = { AssignTo: selecteditem1, Status: selecteditem6 };

另外,根据亨利的回答,使用签名:

public ActionResult Update(BugModel model, 
              FormCollection form, 
              string AssignTo, 
              string Status)
那么,你当然应该能够从form[]集合中获得所需的两个值,因为你在幕后做了HttpPost

(即var assignTo = form["AssignTo"];等)。

[编辑] - 出于好奇,我可以问为什么要将jquery语法与更传统的javascript对象语法混合搭配。一个例子是你得到EmployeeID选项的值?为什么不使用var selecteditem1 = $('#EmployeeID').val();

我还注意到ViewBag对象在HttpPost操作中得到了更新。您是否希望能够在返回视图时使用它 - 当然不是(不管是否在ajax请求方面)。快速解释我的好奇心会很棒。在我看来,你试图用这个动作做太多(当然,保持干燥 - 但是)我担心你最终会进入一个角落,看起来你正在建造不同的入口点起来。我建议一个温和的倒带,只是为了让事情更加集中,每个行动都有一个责任。

答案 2 :(得分:0)

我最终做了以下事情:

      <script type="text/javascript">
    $(document).ready(function () {

        $("#butValidateForm").click(function () {               
            UpdateMethod();
        })
    });
    function UpdateMethod() {
        var s = document.getElementById("EmployeeID");
        var selecteditem1 = s.options[s.selectedIndex].value;

        var a = document.getElementById("FromStatusId");
        var selecteditem6 = a.options[a.selectedIndex].value;

       // var data = '{AssignTo:' + selecteditem1 + '}';
       // alert(data);
        var AssignTo;
        var Title;
        Title=$("#Title").val();
        var FixedBy;
        FixedBy = $("#LoginName").val();
        var Resolution;
        Resolution = $("#Resolution").val();
        var Status;
        Status = $("#FromStatusId").val();
        $.ajax({
            type: "POST",
            url: "/ViewBug/Update/",
            enctype: 'multipart/form-data',
            data: {AssignTo:selecteditem1,Title:Title,FixedBy:FixedBy,Resolution:Resolution,Status:Status},
            success: function () {
            }
        });
    }



</script>