试图找出Ajax.BeginForm

时间:2012-10-08 13:41:34

标签: asp.net-mvc

我有两个部分的观点。 顶部我输入字段并提交以保存它们。 在第二部分中,我有一个自动完成文本框。我在自动填充中选择了一个项目,当我单击提交时,我想将该项目添加到数据表中。 因此,对于第一部分,当我单击提交时,我通过控制器上的HttpPost方法保存详细信息。 对于第二部分,我打算通过对控制器的Ajax调用来保存它,然后带回一个带有结果的局部视图。我还没有编写局部视图,接下来就是。 现在我是Ajax.BeginForm的新手,我正在努力解决它。 我希望Ajax.BeginForm中的提交按钮只适用于表单的那一部分。 但实际上它为整个表单调用了HttpPost方法。 那么我该如何解决这个问题呢? 我的观点看起来像;

@using ITOF.HtmlHelpers
@model ITOF.Models.OngoingContractViewModel
@{
    ViewBag.Title = "EditOngoingContractDetails";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
    @using (Html.BeginForm("EditOngoingContractDetails", "Contract", FormMethod.Post,
         new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        @Html.HiddenFor(model => model.Contract.ContractId)
        <h1>Edit Ongoing Contract Details</h1>
        <fieldset>
            <legend>@Model.Contract.Heading</legend>
            <p>Where you see <span class="error">*</span> you must enter data.</p>
            <table>
                <tr>
                    <td style="text-align: right">
                        @Html.LabelFor(model => model.Contract.EndDate)
                    </td>                    
                    <td>
                        @Html.EditorFor(model => model.Contract.EndDate)
                    </td>
                </tr>
                <tr>
                    <td style="text-align: right">
                        @Html.LabelFor(model => model.Contract.Organogramme)    
                    </td>
                    <td>
                        <input type="file" id="PDF" name="file" />
                        @Html.HiddenFor(model => model.Contract.Organogramme)
                    </td>
                </tr>
                @if (!string.IsNullOrWhiteSpace(Model.Contract.Organogramme))
                {
                    <tr>
                        <td></td>
                        <td>
                            The current organogramme is <span class="HighlightTextRed">@Model.GetOrganogrammeName()</span> 
                            for the contract <span class="HighlightTextRed">@Model.Contract.ContractName</span><br/>
                            <a href="@Model.Contract.Organogramme" target="_blank">Click here to see the last saved organogramme</a> 
                        </td>
                    </tr>
                }
                <tr>
                    <td style="text-align: right">
                        @Html.LabelFor(model => model.Contract.AssistantRLOManagerId)
                    </td>                    
                    <td>
                        @Html.DropDownListFor(model => model.Contract.AssistantRLOManagerId, Model.AssistantRloManagerSelectList, "--N/A--")
                    </td>                   
                </tr>
                @if (this.TempData["SuccessMessage"] != null)
                {
                    <tr>
                        <td colspan="2" class="success">@this.TempData["SuccessMessage"].ToString()</td>
                    </tr>
                }
                <tr>
                    <td colspan="2" style="padding-top: 20px; text-align: center;"><input type="submit" value="Save" /></td>
                </tr>
            </table>
        </fieldset>


        <fieldset>
            <legend>Add an existing Site to this contract: </legend>
            @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" />
            }

            @if (Model.SiteList.Count > 0)
            {
                <table id="siteDataTable" class="display">
                    <thead>
                        <tr>
                            <th>Main Site?</th>
                            <th>Type</th>
                            <th>Address</th>
                            <th>Map</th>
                            <th>Telephone</th>
                            <th>Email</th>
                        </tr>
                    </thead>
                    <tbody id="siteRows">
                        @foreach (var item in Model.SiteList)
                        {
                            <tr id="@item.SiteContract.SiteContractId">
                                <td>@item.SiteContract.MainSiteFlag</td>
                                <td>@item.Site.SiteType</td>
                                <td>@item.Site.Address</td>
                                <td>@item.Site.MapUrl</td>
                                <td>@item.Site.Telephone</td>
                                <td>@item.Site.Email</td>
                            </tr>
                        }
                    </tbody>
                </table>
                <div class="add_delete_toolbar" />
            }
            @Html.ListLink("Back to List") 
        </fieldset>
    }

1 个答案:

答案 0 :(得分:1)

哦不,你不能嵌套HTML表格。这不受支持。你必须重新考虑你的设计。这与ASP.NET MVC以及Html.BeginFormAjax.BeginForm之类的内容完全无关。 HTML规范只是告诉您<form>标记不能嵌套,如果嵌套它,您将得到不同浏览器之间不同的行为。

例如,您可以使用jquery UI autocomplete plugin实现自动填充功能,并删除Ajax.BeginForm