【问题标题】:Ajax post model to controller actionAjax 将模型发布到控制器操作
【发布时间】:2018-10-12 19:16:03
【问题描述】:

在 mvc4 中,我尝试使用 Jquery Ajax 将模型数据从视图发布到控制器,但现在不要知道这段代码有什么问题,任何人都可以在这件事上帮助我。

<script src="~/Scripts/jquery-1.8.2.js"></script>
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>

<script type="text/javascript">

    $(document).ready(function () {
        $("#save").click(function () {
            $("#content").html("<b>Please Wait...</b>");
            var dataObject = {
                empid: 1,
                EmployeeName: "rizwan",
                Address: "lahore",
                Country: "pakistan",
                Salary: "35000.00",
                DepartmentName: "Field"
            }
            $.ajax({
                type: "POST",
                url: "/Home/Index",
                data: dataObject,
                success: function (data)
                { 
                    $("#empname").val(''),
                    $("#empadd").val(''),
                    $("#empcountry").val(''),
                    $("#empsalary").val(''),
                    $("#empdeptname").val(''),
                    $("#content").html("<div class='success'>"+data+"</div>")
                },
                error: function (ehr)
                {
                    $("#content").html("<div class='failed'>Error! Please try again</div>");
                },
            })
        });
    });
</script>

这是我的控制器动作代码,它只接收对象的值并保存到数据库中 问题是我未能在控制器操作端接收值。
请帮帮我.....

[HttpPost]
public ActionResult Index(userview dataObject)
{         
    department dept = new department();
    employee emp = new employee();
    string message = "";
    try
    {
        emp.employeeName = dataObject.EmployeeName;
        emp.address = dataObject.Address;
        emp.country = dataObject.Country;
        emp.salary = dataObject.Salary;
        dept.departmentName = dataObject.DepartmentName;
        db.employees.Add(emp);
        db.departments.Add(dept);
        db.SaveChanges();
    }
    catch(Exception ex)
    {
         message = "Error! Please try again";
    }
    if (Request.IsAjaxRequest())
    {
        return new JsonResult { Data = message, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
    ViewBag.message = message;
    return View();
}

这是我的模型类

   public class userview
    {

        public int empId { get; set; }
        public string EmployeeName { get; set; }
        public string Address { get; set; }
        public string Country { get; set; }
        public decimal Salary { get; set; }
        public string DepartmentName { get; set; }


    }

【问题讨论】:

  • 不相关,但不包括同一文件的未缩小版和缩小版
  • 您是否在浏览器控制台中遇到任何错误?
  • 当我们点击保存按钮时,控制器操作端没有收到值,即使我排除了未缩小的,我只保留一个缩小版本文件
  • 你能发布模型类吗?我的意思是用户视图类。
  • 公共用户视图(){ }

标签: ajax asp.net-mvc


【解决方案1】:

尝试使用 JSON.stringify

$.ajax({
                type: "POST",
                url: "/Home/Index",
                data: JSON.stringify(dataObject), //Here is the change
                success: function (data)
                { 
                    $("#empname").val(''),
                    $("#empadd").val(''),
                    $("#empcountry").val(''),
                    $("#empsalary").val(''),
                    $("#empdeptname").val(''),
                    $("#content").html("<div class='success'>"+data+"</div>")
                },
                error: function (ehr)
                {
                    $("#content").html("<div class='failed'>Error! Please try again</div>");
                },
            })

【讨论】:

  • 是的,我尝试使用 JSON.stringify(dataObject),但我仍然收到同样的问题
  • 你的模型“userview”有无参数构造函数吗?有时,添加一个空的构造函数会使模型绑定器工作。不太清楚为什么会这样。
  • 无参数或参数化
【解决方案2】:

您可以自己实现 BindModel!获取 json 字符串并反序列化为您的实体。

public class JsonBinder<T> : System.Web.Mvc.IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        using (var reader = new System.IO.StreamReader(controllerContext.HttpContext.Request.InputStream))
        {
            //set stream position 0, maybe previous action already read the stream.
            controllerContext.HttpContext.Request.InputStream.Position = 0;
            string json = reader.ReadToEnd();
            if (string.IsNullOrEmpty(json) == false)
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                object jsonData = serializer.DeserializeObject(json);
                return serializer.Deserialize<T>(json);
            }
            else
            {
                return null;
            }
        }
    }
}

并将 JsonBinder 设置为 post 方法,如

[HttpPost]
public ActionResult Index([ModelBinder(typeof(JsonBinder<userview>))] userview dataObject)
{
}

另一种解决方案

我发现你可以将DataContract设置为Model的类,并将DataMember设置为类的Properties。

像这样编辑类

[DataContract]
public class userview
{
    [DataMember]
    public int empId { get; set; }
    [DataMember]
    public string EmployeeName { get; set; }
    [DataMember]
    public string Address { get; set; }
    [DataMember]
    public string Country { get; set; }
    [DataMember]
    public decimal Salary { get; set; }
    [DataMember]
    public string DepartmentName { get; set; }
}

你应该添加库引用“System.Runtime.Serialization”

希望它对你有用。

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 2013-01-07
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多