0

我有 ASP.net-mvc5 网站。我需要允许用户更新/编辑两个紧急联系方式。为了实现这一点,我将“list myModel”发送到剃须刀视图,并且在视图中我得到了两个@html.beginform。我有 List 因为我知道我总是有两个记录。我通过记录 1 的索引 0 和记录 2 的索引 0 从列表中打印值。用于将数据发布回控制器的 Jquery Ajax 函数。

现在,紧急联系人详细信息 1 的表格 1 工作正常,但第二紧急联系人详细信息的表格 2 将空值发布到控制器。我已经提交了 form1 并尝试提交 form2 但仍然是空值。我不确定为什么会这样。

控制器

  [Authorize]
    [HttpGet]
    public ActionResult EditEmergencyContact()
    {

        int _studentEntityID = 0;

        _studentEntityID = _studentProfileServices.GetStudentIDByIdentityUserID(User.Identity.GetUserId());

        List<EmergencyContact> _emergencyContactModel = new List<EmergencyContact>();

        _emergencyContactModel = _studentProfileServices.GetEmergencyContactByStudentID(_studentEntityID);

        return PartialView("EditEmergencyContact_Partial", _emergencyContactModel);

    }

    [Authorize]
    [HttpPost]
    public ActionResult EditEmergencyContact(List<EmergencyContact> _emergencyContactModel)
    {
       try
        {
            if (_emergencyContactModel!=null && _emergencyContactModel.Count()>0)
            {
                if (ModelState.IsValid)
                {


                    int _entityID = _studentProfileServices.EditEmergencyContactByStudentID(
                        new EmergencyContact
                        {
                            EmergencyContactID = _emergencyContactModel[0].EmergencyContactID,
                            StudentID = _emergencyContactModel[0].StudentID,
                            NameOfContact = _emergencyContactModel[0].NameOfContact,
                            Relationship = _emergencyContactModel[0].Relationship,
                            Telephone = _emergencyContactModel[0].Telephone,
                            Mobile = _emergencyContactModel[0].Mobile,
                            Address = _emergencyContactModel[0].Address
                        });

                    if (_entityID != 0)
                    {
                        return Json(new { Response = "Success" });
                    }
                    else
                    {
                        return Json(new { Response = "Error" });
                    }
                }
                else
                {
                    return Json(new { Response = "Invalid Entry" });
                }
            }
            else
            {
                  return Json(new { Response = "Error! In Updating Record" });
            }
        }
        catch (DataException ex)
        {
            ModelState.AddModelError("", "Unable To Edit Emergency Contact" + ex);
        }

        return RedirectToAction("MyProfile", "StudentProfile");
    }

看法

@using (Html.BeginForm("EditEmergencyContact", "StudentProfile", FormMethod.Post, new { id = "EditNo2EmergencyContactForm" }))
{
  @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Emergency Contact 2</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model[1].EmergencyContactID)

    <div class="form-group">
        @Html.LabelFor(model => model[1].StudentID, "StudentID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].StudentID, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].StudentID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].NameOfContact, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].NameOfContact, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].NameOfContact, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Relationship, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Relationship, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Relationship, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Telephone, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Telephone, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Telephone, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Mobile, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Mobile, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Mobile, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Address, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Address, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Address, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
 </div>
}

jQuery 函数

 $('#EditNo2EmergencyContactForm').submit(function (e) {

    e.preventDefault();

    var formURL = $(this).attr("action");

    alert($(this).serialize());

    $.ajax({
        url: formURL,
        type: "POST",
        data: $(this).serialize()
    }).done(function (data, textStatus, jqXHR) {

        if (data.Response == "Success") {

            $(this).MyMessageDialog({
                _messageBlockID: "_StatusMessage",
                _messageContent: "Record Been Updated Successfully",
                _messageBlockWidth: "300px"
            });

            $('div#_StatusMessage').on('dialogclose', function (event) {
                window.location = "/StudentProfile/MyProfile";
            });
        }
        else {

            $(this).MyMessageDialog({
                _messageBlockID: "_StatusMessage",
                _messageContent: "<div class='errorMessage'>" + data.Response + "</div>",
                _messageBlockWidth: "300px"
            });
        }
    }).fail(function (jqXHR, textStatus, errorThrown) {
        $(this).MyMessageDialog({
            _messageBlockID: "_StatusMessage",
            _messageContent: "<div class='errorMessage'> Error In Updating Record! " + textStatus + "  " + errorThrown + "  "+jqXHR.status +"</div>",
            _messageBlockWidth: "350px"
        });

        $('div#_StatusMessage').on('dialogclose', function (event) {
            window.location = "/StudentProfile/MyProfile";
        });
    });
});

对于表格 1:这个有效

 @using (Html.BeginForm("EditEmergencyContact", "StudentProfile", FormMethod.Post, new { id = "EditNo1EmergencyContactForm" }))

.....................

 $('#EditNo1EmergencyContactForm').submit(function (e) {
4

1 回答 1

1

您正在为不同的表单使用相同的控制器发布操作。您的操作更新模型(实体列表)仅存在于第一个位置的实体。您的模型有一个 [entity0, entity1] 列表,但在表单视图中,您删除了 entity0,因为您仅从具有列表的模型中绑定了一个 entity1。

在这里,您有两种方法:

使后控制器动作更通用

    public ActionResult EditEmergencyContact (List<EmergencyContact> _emergencyContactModel)
            {

                try
                {

                    if (_emergencyContactModel != null && _emergencyContactModel.Count() > 0)

                    {
                        if (ModelState.IsValid)
                        {
                            bool validation = true;

                            for (int i = 1; i < _emergencyContactModel.Count(); i++)
                            {

                                if (_emergencyContactModel[i].EmergencyContactID != null)
                                {

                                    int _entityID = _studentProfileServices.EditEmergencyContactByStudentID(

                                    new EmergencyContact
                                    {
                                        EmergencyContactID = _emergencyContactModel[i].EmergencyContactID,
                                        StudentID = _emergencyContactModel[i].StudentID,
                                        NameOfContact = _emergencyContactModel[i].NameOfContact,
                                        Relationship = _emergencyContactModel[i].Relationship,
                                        Telephone = _emergencyContactModel[i].Telephone,
                                        Mobile = _emergencyContactModel[i].Mobile,
                                        Address = _emergencyContactModel[i].Address
                                    });

                                    if (_entityID == 0)
                                    {
                                        validation = false;
                                        break;
                                    }
                                }
                            }

                            if (validation)
                            {
                                return Json(new { Response = "Success" });
                            }
                            else
                            {
                                return Json(new { Response = "Error" });
                            }
                        }
                        else
                        {
                            return Json(new { Response = "Invalid Entry" });
                        }
                    }
                    else
                    {
                        return Json(new { Response = "Error! In Updating Record" });
                    }
                }
                catch (DataException ex)
                {
                    ModelState.AddModelError("", "Unable To Edit Emergency Contact" + ex);
                }

                return RedirectToAction("MyProfile", "StudentProfile");
            }

选项 2,不要将模型空实体传递给控制器​​,将值隐藏在表单中:

@using (Html.BeginForm("EditEmergencyContact", "StudentProfile", FormMethod.Post, new { id = "EditNo2EmergencyContactForm" }))
{
  @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Emergency Contact 2</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @* here you pas List 0  model recieved value and viceversa if you edit model[0]*@
    @Html.HiddenFor(model => model[0].EmergencyContactID)
    @Html.HiddenFor(model => model[0].StudentID)
    @Html.HiddenFor(model => model[0].NameOfContact)
    @Html.HiddenFor(model => model[0].Relationship)
    @Html.HiddenFor(model => model[0].Telephone)
    @Html.HiddenFor(model => model[0].Mobile)
    @Html.HiddenFor(model => model[0].Address)
    @Html.HiddenFor(model => model[0].Address)

    @Html.HiddenFor(model => model[1].EmergencyContactID)

    <div class="form-group">
        @Html.LabelFor(model => model[1].StudentID, "StudentID", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].StudentID, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].StudentID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].NameOfContact, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].NameOfContact, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].NameOfContact, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Relationship, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Relationship, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Relationship, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Telephone, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Telephone, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Telephone, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Mobile, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Mobile, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Mobile, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model[1].Address, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model[1].Address, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model[1].Address, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
 </div>
}

您从列表中更新两个实体的控制器:

int _entityID_0 = _studentProfileServices.EditEmergencyContactByStudentID(
new EmergencyContact
{
    EmergencyContactID = _emergencyContactModel[0].EmergencyContactID,
    StudentID = _emergencyContactModel[0].StudentID,
    NameOfContact = _emergencyContactModel[0].NameOfContact,
    Relationship = _emergencyContactModel[0].Relationship,
    Telephone = _emergencyContactModel[0].Telephone,
    Mobile = _emergencyContactModel[0].Mobile,
    Address = _emergencyContactModel[0].Address
});

int _entityID_1 = _studentProfileServices.EditEmergencyContactByStudentID(
new EmergencyContact
{
    EmergencyContactID = _emergencyContactModel[1].EmergencyContactID,
    StudentID = _emergencyContactModel[1].StudentID,
    NameOfContact = _emergencyContactModel[1].NameOfContact,
    Relationship = _emergencyContactModel[1].Relationship,
    Telephone = _emergencyContactModel[1].Telephone,
    Mobile = _emergencyContactModel[1].Mobile,
    Address = _emergencyContactModel[1].Address
});

if (_entityID_0 != 0 && _entityID_1 != 0)
{
    return Json(new { Response = "Success" });
}
else
{
    return Json(new { Response = "Error" });
}

您的方法非常糟糕,您应该逐个更新地址,而不是复杂的地址列表。

于 2015-07-15T14:01:00.080 回答