【问题标题】:Edit Record using Partial View, JQuery and Bootstrap Modal使用 Partial View、JQuery 和 Bootstrap Modal 编辑记录
【发布时间】:2019-04-22 11:23:25
【问题描述】:

我有一个表格,其中最后一列的每条记录都有一个 Edit 按钮。

我的目标是在模式上为用户按下Edit 按钮的记录创建一个可编辑的表单。

为了做到这一点,我创建了一个局部视图,我想将它加载到模态框上,但经过大量尝试后,我无法让它工作。为组成部分视图 URL 并加载到模式中而创建的 JS 似乎没有效果,并且引发以下错误:

VM364 ESa31501901:361 Uncaught ReferenceError: ESa31501901 is not 定义 在 HTMLAnchorElement.onclick

注意:ESa31501901是传入JS函数的第一个参数。

这是我的意图:

a) Edit() :此方法将返回所有记录。

b) EditClientFeature(string ClientID, string WorkProcessID):此方法将返回包含特定客户端记录的部分视图。当我们开始编辑客户记录时会调用此方法。客户记录以模式(弹出)显示。

c)EditClientFeature(ClientFeatureViewModel model):此方法将更新客户端记录。

ClientFeature 视图模型

public class ClientFeatureViewModel
{
    public string ClientID { get; set; }
    public string WorkProcessID { get; set; }
    public int? Certification { get; set; }
    public bool? TrackingActive { get; set; }
    public string ClientCode { get; set; }
    public string ContractNo { get; set; }
    public string ProductCode { get; set; }
}

Edit.cshtml

[...]

<tbody>
@foreach (var feature in Model.ClientFeatures)
{
 <tr>
     <td style="text-align:center"><strong>@feature.WorkProcessId</strong>/td>
     <td style="text-align:center">@feature.Certificate</td>
     <td style="text-align:center">@feature.TrackingActive</td>
     <td style="text-align:center">@feature.ClientCode</td>
     <td style="text-align:center">@feature.ContractNo</td>
     <td style="text-align:center">@feature.ProductCode</td>
     <td>
       <a href="#" class="btn btn-success" onclick="EditCF(@Model.Piva, @feature.WorkProcessId)"><i class="glyphicon glyphicon-pencil"></i></a>                                                                                                                                                                
    </td>
    </tr>
}
</tbody>

[...]

    <div class="modal fade" id="ModalClientFeatures">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <a href="#" class="close" data-dismiss="modal">&times;</a>
                    <h3 class="modal-title">Edit</h3>
                </div>
                <div class="modal-body" id="ModalBodyDiv">

                  <!-- Here's where i want to show the partial view-->

                </div>
            </div>
        </div>
    </div>

[...]

<script>    
        function EditCF(ClientID, WorkProcessID) {

            var url = "/Admin/EditClientFeature?ClientID=" + ClientID + "?WorkProcessID=" + WorkProcessID;

            $("#ModalBodyDiv").load(url, function () {
                $("#ModalClientFeatures").modal("show");

            })

        }
</script>

ClientFeaturepartialView.cshtml

@model Project.Models.ClientFeatureViewModel

<script src="~/Scripts/jquery-3.3.1.js"></script>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

<form id="myForm">

    <div class="form-horizontal">
        <h4>ClientFeatureViewModel</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.ClientID)

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

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

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

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

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

        <div class="form-group">
            @Html.LabelFor(model => model.ProductCode, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ProductCode, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ProductCode, "", 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" />
                <a href="#" id="btnSubmit" class="btn btn-success btn-block">
                    <span>Update</span>
                </a>
            </div>
        </div>

    </div>
</form>
}

控制器

    public ActionResult EditClientFeature(string ClientID, string WorkProcessID)
    {
        PMEntities db = new EntityConn().Db;

        ClientFeatures ClientFeature = db.ClientFeatures.Where(cf => cf.ClientId == ClientID && cf.WorkProcessId == WorkProcessID).SingleOrDefault();

        if (ClientFeature != null) {

            ClientFeatureViewModel model = new ClientFeatureViewModel
            {
                ClientID = ClientFeature.ClientId,
                WorkProcessID = ClientFeature.WorkProcessId,
                Certification = ClientFeature.Certificate,
                TrackingActive = ClientFeature.TrackingActive,
                ClientCode = ClientFeature.ClientCode,
                ContractNo = ClientFeature.ContractNo,
                ProductCode = ClientFeature.ProductCode,

            };

            return PartialView("ClientFeaturePartialView", model);
        }
        else { return View("Error"); }      

    }

    [HttpPost]
    public ActionResult EditClientFeature(ClientFeatureViewModel model)
    {
        try
        {
            PMEntities db = new EntityConn().Db;

            if (model.ClientID != null)
            {
                //update
                ClientFeatures ClientFeature = db.ClientFeatures.Where(cf => cf.ClientId == model.ClientID && cf.WorkProcessId == model.WorkProcessID).SingleOrDefault();

                ClientFeature.Certificate = model.Certification;
                ClientFeature.ClientCode = model.ClientCode;
                ClientFeature.ContractNo = model.ContractNo;
                ClientFeature.ProductCode = model.ProductCode;
                ClientFeature.TrackingActive = model.TrackingActive;

                db.SaveChanges();

            }
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

【问题讨论】:

    标签: javascript c# jquery asp.net-mvc partial-views


    【解决方案1】:

    我认为您的onclick 函数参数值被视为变量,而不是字符串。

    解决方案 1:

    尝试下面作为字符串传递:(虽然没有测试!)

    onclick="EditCF(\'' + @Model.Piva + '\', \'' + @feature.WorkProcessId+ '\')"
    

    解决方案 2:

    最好在为您的链接添加类之后附加click 处理程序。并使用 HTML5 data attributes 来存储您的价值客户端。

    <a href="#" class="btn btn-success editClient" data-ClientID="@Model.Piva" data-WorkProcessId="@feature.WorkProcessId"><i class="glyphicon glyphicon-pencil"></i></a> 
    
    
    $('.editClient).on('click', function() {
        var clientID = $(this).data('ClientID');
        var workProcessId = $(this).data('WorkProcessId');
    
        var url = "/Admin/EditClientFeature?ClientID=" + clientID 
        + "?WorkProcessID=" + workProcessID;
    
        $("#ModalBodyDiv").load(url, function () {
    
          $("#ModalClientFeatures").modal("show");
    
        })
    
    });   
    

    Reference

    希望这会有所帮助。

    【讨论】:

    • 感谢您的提示!我已经尝试过了,它正在工作。模态显示部分视图的内容。但有一个问题。形成的 url 是正确的(我在加载模式之前检查了显示 alert(url);),但是传递给控制器​​方法的参数是错误的。 ClientID 带有"ESa31501901?WorkProcessID=BCC_BN_FR" 值,WorkProcessID 带有null。你知道为什么吗?
    • @equisde ,您尝试过解决方案 1 吗?
    • 不!我直接选择了我认为更正确的选项:-D 让我尝试一下,我会返回结果。谢谢!
    • @equisde 好的,顺便说一下,如果 url 正确,那么它应该将正确的值传递给您的 Action Method。请检查参数名称,它应该匹配。
    • 我终于让它工作了。正如您所说,网址格式错误。已解决var url = "/Admin/EditClientFeature?ClientID=" + ClientID + "&amp;WorkProcessID=" + WorkProcessID;。谢谢大家!
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多