0

私は2つのセクションでビューを持っています。一番上のセクションでは、フィールドを入力して送信し、それらを保存します。2 番目のセクションには、オートコンプリート テキスト ボックスがあります。オートコンプリートでアイテムを選択し、送信をクリックすると、そのアイテムをデータテーブルに追加したいと考えています。したがって、送信をクリックした最初の部分では、コントローラーの HttpPost メソッドを介して詳細を保存します。2 番目の部分では、コントローラーの 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>
    }
4

1 に答える 1

1

HTML フォームをネストすることはできません。それはサポートされていません。設計を再考する必要があります。Html.BeginFormこれは、ASP.NET MVC ややなどとはまったく関係ありませんAjax.BeginForm。HTML 仕様では、<form>タグをネストすることはできず、ネストすると、ブラウザによって異なる可能性のある未定義の動作が発生することが示されています。

たとえば、jquery UI オートコンプリート プラグインを使用してオートコンプリート機能を実装し、Ajax.BeginForm.

于 2012-10-08T13:45:52.967 に答える