1

在我看来,我有;

@using (Ajax.BeginForm("AddExistingSite", new AjaxOptions { UpdateTargetId = "siteRows" }))
            {

                <input type="text" name="q" style="width: 800px" 
                       data-autocomplete="@Url.Action("SiteSearch", "DataService", new { contractId = @Model.Contract.ContractId })" />
                <input type="submit" value="Add site to contract" />
            }

在我的控制器中,我有

public ActionResult SiteSearch(string term, int contractId)
    {
        using (var db = new SherryGreenGroupEntities())
        {
            var sites = db.Sites
                .Include("SiteContracts")
                .Where(x => x.SiteContracts.All(y => y.ContractId != contractId || y.EndDate.HasValue)  &&
                    x.Address.Contains(term))
                .Take(10)
                .Select(x => new { id = x.SiteId, label = x.Address }).ToList();
            return this.Json(sites, JsonRequestBehavior.AllowGet);
        }
    }

我已经设置了 jquery;

$(":input[data-autocomplete]").each(function () {
    $(this).autocomplete({ source: $(this).attr("data-autocomplete") });
});

现在自动完成功能正在工作,但我想知道我该怎么做才能获取所选项目的 ID,以便将其发布到控制器?

4

1 回答 1

2

目前,您的表单内只有一个文本字段将保存所选值。如果您需要相应的 id,您可以添加一个隐藏字段,用于存储此信息:

@using (Ajax.BeginForm("AddExistingSite", new AjaxOptions { UpdateTargetId = "siteRows" }))
{
    <input type="text" name="q" style="width: 800px" data-autocomplete="@Url.Action("SiteSearch", "DataService", new { contractId = @Model.Contract.ContractId })" />
    <input type="hidden" name="itemId" class="itemId" />
    <input type="submit" value="Add site to contract" />
}

然后订阅select自动完成的事件并用相应的值更新它:

$(':input[data-autocomplete]').each(function () {
    $(this).autocomplete({
        source: $(this).attr('data-autocomplete'),
        select: function (event, ui) {
            $(this).closest('form').find('.itemId').val(ui.item.value);
        }
    });
});

现在在目标控制器操作中,获取标签和 id 是微不足道的:

[HttpPost]
public ActionResult AddExistingSite(string q, string itemId)
{
    ...
}

显然,这一切只是一个原始的例子。在实际应用程序中,您不应该在视图中对输入字段进行硬编码,而是应该使用 HTML 助手来生成它们,并且显然应该使用视图模型。

于 2012-10-08T16:52:08.283 回答