0

我有以下表格

<form class="regForm" id="frmRegistration" method="post">
<h3>Register Customer Patient</h3>
@Html.ValidationSummary(true)

@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName, new { @class = "form-control cfield", required = "required", autofocus = "autofocus" })
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName, new { @class = "form-control cfield", required = "required" })

@Html.LabelFor(m => m.MiddleName)
@Html.TextBoxFor(m => m.MiddleName, new { @class = "form-control cfield", required = "required" })
@Html.LabelFor(m => m.BirthDate)
@Html.TextBoxFor(m => m.BirthDate, new { @class = "form-control cfield", required = "required" })
@Html.LabelFor(m => m.Address)
@Html.TextBoxFor(m => m.Address, new { @class = "form-control cfield", required = "required" })
<button type="submit" id="btnSave" class="btnreg btn btn-primary form-control">REGISTER</button>
<button type="button" onclick="clearTexts();" class="btnClear btn btn-danger form-control">CLEAR</button>

下面是我要触发/调用的控制器操作方法

 [HttpPost]
    public ActionResult AddCustomerPatient(Customer _Customer)
    {
        using (var db = new DCDBEntities())
        {
            db.Customers.Add(_Customer);
            db.SaveChanges();
        }

        return  Json(new {registeredCustomer="ok"});

    }

下面是我的 jquery ajax,它不起作用

  $("#btnSave").click(function () {
            e.preventDefault();
            var PotentialCustomer = {

                "LastName": 'A',
                "FirstName": 'A',
                "MiddleName": 'A',
                "BirthDate": 'A',
                "Address": 'A'

            };


            $.ajax({
                type: 'POST',
                url: '/Registration/AddCustomerPatient',
                data: 'JSON.stringify(PotentialCustomer),',
                contentType: "application/json; charset=utf-8",
                dataType: 'json',
                success: function (response) {
                    alert("Successfully Registered Customer/Patient!");

                }
            });
        });

问题 1.) 控制器操作方法没有被命中(我放置了一个断点)

问题 2.) 如何将模型传递给控制器​​操作方法并通过 linq 将其保存到实体。

我一直在寻找并尝试了很多,但仍然无法完成。

下面是路由配置

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

我试图在我的控制器的 GET 或第一个方法中放置一个断点,每当我点击“REGISTER”按钮时,它都会被点击而不是 [HttpPost],这是为什么呢?

  public ActionResult RegisterCustomerPatient()
    {
        return View();
    }

    [HttpPost]
    public ActionResult AddCustomerPatient(Customer _Customer)
    {
        using (var db = new DCDBEntities())
        {
            db.Customers.Add(_Customer);
            db.SaveChanges();
        }

        return  Json(new {registeredCustomer="ok"});

    }

我需要为 HTTPPOST 操作方法创建一个视图吗?

4

6 回答 6

1
 var formData = $('#frmRegistration').serialize();
        $.ajax({
            type: 'POST',
            url: '@Url.Action("AddCustomerPatient", "Registration")',
            data: formData,
            success: function (response) {
                alert("Successfully Registered Customer/Patient!");
             }
         });

更好地序列化表单数据并将其发送到控制器操作方法

于 2017-03-21T10:39:01.550 回答
1

问题是线

 data: 'JSON.stringify(PotentialCustomer),',

 click(function () {
 // e is undefined here. Add e as parameter in function.
    e.preventDefault();

JSON.stringify 应该用作函数而不是字符串。在上面它被用作字符串。将其更改为以下(假设所有字段都是模型中的字符串)

$("#btnSave").click(function (e) {
        e.preventDefault();
        var PotentialCustomer = {

            "LastName": 'A',
            "FirstName": 'A',
            "MiddleName": 'A',
            "BirthDate": 'A',
            "Address": 'A'

        };


        $.ajax({
            type: 'POST',
            url: '/Registration/AddCustomerPatient',
            data: JSON.stringify(PotentialCustomer),
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (response) {
                alert("Successfully Registered Customer/Patient!");

            }
        });
于 2017-03-21T10:42:09.133 回答
1

数据:'JSON.stringify(潜在客户),'

请去掉单引号。这将是很好的数据: JSON.stringify(PotentialCustomer),

于 2017-03-21T10:57:34.647 回答
1

有一个,内部数据

数据:'JSON.stringify(潜在客户) ',

接下来我不确定,但试试

数据:{'_customer':'潜在客户'}; 而不是 data.strinify

于 2017-03-21T11:17:38.570 回答
1

问题 1.) 控制器操作方法没有被击中

我认为这是由 ajax 帖子的错误 URL 引起的。您可以尝试在浏览器上打开开发者工具的网络选项卡来确认。如果您 ajax 发布返回 HTTP 状态 404,您应该更新您的 ajax 发布的 URL。
获得正确 URL 的一种方法是使用 @Url.Action 添加提交按钮的 URL 属性。

<button type='button' id='btnSave' data-url='@Url.Action("AddCustomerPatient", "Registration")' class='btnreg btn btn-primary form-control'>REGISTER</button>

然后你可以像这样在点击函数中得到这个值

$("#btnSave").data('url')

问题 2.) 如何将模型传递给控制器​​操作方法并通过 linq 将其保存到实体。

获得正确的 URL 后,您应该更新您的点击功能

$("#btnSave").click(function () {
    var formData = $('#frmRegistration').serialize();
    $.ajax({
        type: 'POST',
        url: $("#btnSave").data('url'),
        data: formData,
        success: function (response) {
            alert("Successfully Registered Customer/Patient!");
         }
     });
 });

替代方法
我猜你想制作一个 ajax 帖子而不是提交表单,所以你可以尝试下面的另一种简单方法。

剃刀密码

@using (Html.BeginForm("AddCustomerPatient", "Registration", FormMethod.Post, new { id = "frmRegistration"))
{
    ...
    <button type="submit" id="btnSave" class="btnreg btn btn-primary form-control">REGISTER</button>
    <button type="button" onclick="clearTexts();" class="btnClear btn btn-danger form-control">CLEAR</button>   
}

剧本

$(function () {
    $("#frmRegistration").on('submit', function (e) {

        e.preventDefault(); // prevent the form's normal submission

        var $form = $(this);
        var dataToPost = $form.serialize();

        $.post($form.attr('action'), dataToPost)
            .done(function(response, status, jqxhr){ 
                // this is the "success" callback
            })
            .fail(function(jqxhr, status, error){ 
                // this is the ""error"" callback
            });
    })
})
于 2017-03-21T11:30:21.110 回答
0

你的ajax请求应该是这样的

 $("#btnSave").click(function (e) { //added e
            e.preventDefault();
            var _Customer= {     //changed the name to name of parameter of action

                "LastName": $("#LastName").val(),
                "FirstName": $("#FirstName").val(),
                "MiddleName": $("#MiddleName").val(),
                "BirthDate": $("#BirthDate").val(),
                "Address": $("#Address").val()

            };


            $.ajax({
                type: 'POST',
                url: '/Registration/AddCustomerPatient',
                data: JSON.stringify(_Customer),    //removed '' and corrected the format
                contentType: "application/json; charset=utf-8",
                dataType: 'json',
                success: function (response) {
                    alert("Successfully Registered Customer/Patient!");

                }
            });
        });

JSON.stringify是一个函数,所以它不应该放在里面'',并且JSON.stringify(_Customer)对象名称应该与 Action 的参数名称相匹配,Customer _Customer并且你在e.preventDefault();没有添加e参数的情况下使用

于 2017-03-21T10:37:30.563 回答