2

漫长的一天,我仍在为这个问题在桌子上敲打我的头。我想我已经阅读了关于堆栈溢出的所有 jQuery ui 自动完成帖子以及大多数 jQuery ui 文档。

问题:

我在 asp.net mvc 4 应用程序中有一个表单。该表格用于提交时间表/工作票。用户选择一个项目并基于该项目启用工作订单号的自动完成字段。如果用户选择项目的现有工作订单号,我将使用有关工作订单的信息填充两个额外的输入。我需要允许用户在不选择自动完成建议的工作订单的情况下输入全新的工作订单,并且仍然验证表单。问题是如果我不从自动完成中选择建议,验证将失败。

jQuery-ui 文档确实显示了可以使用的方法 close、disable 和 destroy ,但我没有找到一个很好的例子来说明如何使用它们以及在我的情况下实际上最好使用它们。另外值得注意的是,我使用的是 jQuery-ui 1.9

我得到的错误:

System.Data.Entity.Validation.DbEntityValidationException:一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。

错误指向我调用 _db.SaveChanges(); 的控制器上的代码行;

        if ( ModelState.IsValid )
        {
            _db.WorkTickets.Add(workticket);
            _db.SaveChanges();
        }

模型状态有效,我没有尝试保存空值。我的模型确实允许一些字段为空,但在这种情况下,所有字段都是完整的。

如果我从自动完成小部件中选择现有工作订单或将其留空,则该表单非常有用。只有当我输入新的工单时它才会失败。我已经设置了一个断点,并在调用保存更改之前验证了该模型确实具有我为工作票输入的值。WONumber。

这是我的 jQuery。

$(document).ready(function () {

    $("#ProjectID").change(function () {
        var id = $(this).val();
        var results = "result";

        var source1 = "Project/QuickCCSearch?project=" + id;
        $("#ChargeCode").autocomplete({ source: source1 });
        $("#ChargeCode").attr("disabled", false)

        var source2 = "Project/QuickPOSearch?project=" + id;
        $("#PONumber").autocomplete({ source: source2 });
        $("#PONumber").attr("disabled", false)

        var source3 = "Project/QuickWOSearch?project=" + id;
        $("#WONumber").attr("disabled", false)
        $("#WONumber").autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: source3,
                    data: request,
                    success: function (data) {
                        response(data);
                        if (data.length === 0) {
                            $("#WONumber").attr("check", false);
                        }
                    }
                });
            },
            change: function () {
                if ($("#WONumber").attr("check") != false) {
                    $.getJSON("Project/JobLocation", { wo: $("#WONumber").val() },
                                function (data) {
                                    $("#JobLocation").val(data);
                                });

                    $.getJSON("Project/JobDescription", { wo: $("#WONumber").val() },
                                function (data) {
                                    $("#JobDescription").val(data);
                                });
                }
            }
        });

        $.getJSON("WorkTicket/GetClient/", { id: id },
            function (data) {
                $("#Client").html(data);
            });

        $.getJSON("WorkTicket/GetClientRep/", { id: id },
            function (data) {
                $("#ClientRep").html(data);
            });

        $.getJSON("WorkTicket/GetManager/", { id: id },
            function (data) {
                $("#Manager").html(data);

            });

    });

})

编辑:这是我的 HTML

@model WorkTicket

@{
ViewBag.Title = "Create";
}
<article>
<div class="linearBg1">
    Create Daily Work Ticket
</div>
<br />
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <div class="linearBg1">
        General Information
    </div>
    <div class="section-span-body">
        <table>
            <tr class="empTableRowBody2">
                <th class="empTableRowBody2">
                    @Html.LabelFor(Model => Model.DateWorked)
                </th>
                <th class="empTableRowBody2" colspan="2">
                    @Html.LabelFor(Model => Model.ProjectName)
                </th>
            </tr>
            <tr>
                <td>
                    @Html.EditorFor(Model => Model.DateWorked)
                </td>
                <td colspan="2">
                    @Html.DropDownList("ProjectID")
                </td>
            </tr>
            <tr class="empTableRowBody2">
                <th class="empTableRowBody2">
                    Client
                </th>
                <th class="empTableRowBody2">
                    Client Rep
                </th>
                <th class="empTableRowBody2">
                    Manager
                </th>
            </tr>
            <tr>
                <td>
                    <div id="Client"></div>
                </td>
                <td>
                    <div id="ClientRep"></div>
                </td>
                <td>
                    <div id="Manager"></div>
                </td>
            </tr>
            <tr class="empTableRowBody2">
                <th class="empTableRowBody2">
                    Charge Code
                </th>
                <th class="empTableRowBody2">
                    PO Number
                </th>
                <th class="empTableRowBody2">
                    Work Order
                </th>
            </tr>
            <tr>
                <td>
                    @Html.TextBoxFor(Model => Model.ChargeCode, new { disabled = true })
                </td>
                <td>
                    @Html.TextBoxFor(Model => Model.PONumber, new { disabled = true })
                </td>
                <td>
                    @Html.TextBoxFor(Model => Model.WONumber, new { disabled = true, check = true })
                </td>
            </tr>
            <tr class="empTableRowBody2">
                <th class="empTableRowBody2" colspan="3">
                    Job Location
                </th>
            </tr>
            <tr>
                <td colspan="3">
                    @Html.TextBoxFor(Model => Model.JobLocation, new { @class = "inputWidth500" })
                </td>
            </tr>
            <tr class="empTableRowBody2">
                <th class="empTableRowBody2" colspan="3">
                    Job Description
                </th>
            </tr>
            <tr>
                <td colspan="3">
                    @Html.TextBoxFor(Model => Model.JobDescription, new { @class = "inputWidth500" })
                </td>
            </tr>
        </table>
    </div>
    <div class="section-span-footer"></div>
    <br />
    <div>
        <input type="submit" value="Next" />
    </div>
}
</article>
@section Menu{
@Html.Partial("_MainMenu")
@Html.Partial("_MenuFooter")
}
@section scripts{
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/Scripts/WorkTicket.js")
}

我确信我做错了很多事情,因为我是 jQuery 新手并且还在学习。如果用户没有从自动完成小部件中选择选项或者小部件的结果为空,是否有办法禁用自动完成?先感谢您!

T。

4

1 回答 1

1

好的,我终于解决了。它与自动完成无关。只是说明我需要了解多少关于 jQuery 的知识。我的控制器中有一行错误的代码,我在其中将有关新工作订单的信息保存回项目。我错过了一件必需的物品,我只是在看它。抱歉,我是个白痴,对 jQuery 一无所知。感谢任何看过的人。不敢相信我花了这么长时间才看到......

于 2012-10-24T18:45:08.220 回答