0

フォームと送信ボタンがあります。通常、送信アクションが実行されると、新しいページに戻り、部分ビューは更新されません。jqueryライブ関数でajax呼び出しを使用していますが、提供されたモデルで部分ビューを返すのではなく、コンテンツ全体を置き換えます。以下は、_detailfile.cshtml 内の私のコードです。アプリケーションはファイルをアップロードしますが、コンテンツ全体を置き換えます。

<div id="trainingFileDiv" style="overflow: auto; height: 470px;">
 <table class="fileTable">
                @foreach (var training in Model.TrainingList)
                {
                    using (Html.BeginForm("fileForm", "Home/TempUpload", new { employeeId = Model.Id, trainId= @training.Id }, FormMethod.Post, new { enctype = "multipart/form-data" }))
                    {
                        if (training.TrainingFile != null)
                        {
                    <tr>
                        <td>
                        </td>
                    </tr>
                        }

                        else
                        {
                    <tr>
                        <td class="view_detail_label" style="width: 250px;">
                            @training.Name.Name
                        </td>
                        <td>
                            <input  type="file" name="@training.Id"/>
                        </td>

                    </tr>

                     <tr><td><input type="submit" name="Submit" id="Submit" value="Yükle" /></td>

                     </tr>
                        }

                    }

                }
            </table>
</div>

以下は、div ファイルのみを更新するスクリプトですが、機能しません。

 $("fileForm").live("submit",  function (event) {


         if (form.valid()) {
             $.ajax({
                 url: this.action,
                 type: this.method,
                 data: $(this).serialize(),
                 success: function (result) {
                     $('#trainingFileDiv').html(result);
                 }
             });
         }

         event.preventDefault();
     });

これはネットで見つけた別のコードで、div ではなくすべてのコンテンツを更新します。

$(function () {
    $('fileForm').submit(function () {
        if ($(this).valid()) {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    $('#trainingFileDiv').html(result);
                }
            });
        }
        return false;
    });
});

ここで何が欠けていますか?ご協力ありがとうございました

EDIT1 controller から部分ビューが返されると、Uncaught ReferenceError: $ is not definedfileForm:7を取得します

すべてのフォームを ajaxify する EDIT2 関数edit1でエラーが発生します

  $(function () {
         $('form').submit(function () {
             if ($(this).valid()) {
                 $.ajax({
                     url: this.action,
                     type: this.method,
                     data: $(this).serialize(),
                     success: function (result) {
                         $('#trainingFileDiv').append(result);
                     },
                 });//end of ajax call
             }//end of if

         });     });

EDIT3以下のコードではエラーはありませんが、Request にファイルがありません。関数のすぐ下にコントローラー コードが表示されます。しかし、true または false を返すと、ファイルは Request オブジェクトに配置され、コントローラーに送信されます。しかし、返品時にすべてのコンテンツが置き換えられます。ここで何が問題なのですか?

$('form').submit(function (event) {

         if ($(this).valid()) {
             $.ajax({
                 url: this.action,
                 type: this.method,
                 data: $(this).serialize(),
                 success: function (result) {
                     $('#trainingFileDiv').html(result);
                 },
                 complete: function () {
                     console.log("Complete");
                 },
                 error: function () {
                     console.log("Error");
                 }
             }); //end of ajax call
         } //end of if
         //return true;//if commented no error on jquery side but no files are passed to controlller
     });

  foreach (string upload in Request.Files)
            {
                string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/";
                string filename = Path.GetFileName(Request.Files[upload].FileName);
                TrainingFile file = new TrainingFile();
                file.Name = filename;
                file.Path = path;



                var training = _work.TrainingRepository.GetSet().Where(a => a.EmployeeId == employeeId && a.Id == trainId).ToList().ElementAt(0);
                training.TrainingFile = file;
                training.FileId = file.Id;

                _work.TrainingFileRepository.Add(file);
                _work.TrainingFileRepository.Save();
                _work.TrainingRepository.UpdateAndSave(training);
                _work.TrainingRepository.Save();

                Request.Files[upload].SaveAs(Path.Combine(path, filename));
            }
4

3 に答える 3

1
$('#trainingFileDiv').html(result);// ovverides already existing html

$('#trainingFileDiv').append(result); //adds new result to existing html
于 2013-06-12T08:39:04.367 に答える
0

あなたのセレクターは間違っていて、要素を返しません:

$('fileForm')

もちろん、送信ハンドラーを要素にアタッチしていません。

おそらく、id セレクターを使用してフォームを取得したいと思うでしょう。

$('#fileForm')

また、これをフォームに割り当てることを忘れないidでください:

using (Html.BeginForm("fileForm", "Home/TempUpload", new { employeeId = Model.Id, trainId= @training.Id }, FormMethod.Post, new { enctype = "multipart/form-data", id = "fileForm" }))

または、ページ上のすべてのフォームを AJAX 化する場合 (またはフォームが 1 つしかない場合) は、次のように使用できます。

$('form')

もちろん、まったく同じ発言が$("fileForm").liveセレクターを表しています。また、この.liveメソッドはかなり前から廃止されており、先史時代の jQuery バージョンを使用していない限り、おそらく推奨される.on()関数を使用する必要があることに注意してください。

于 2013-06-12T09:26:35.640 に答える
0

残念ながら、私はそこに到達しようとしていますが、まだコメントするのに十分な担当者がいません. ページにフォームが 1 つしかない場合、フォームを取得するには $('form') を使用できます。それ以外の場合は、使用しているビュー エンジンによっては、フォームの Id を指定するために構文を追加する必要がある場合があります。

ダリン・ディミトロフが提案したように:

using (Html.BeginForm("fileForm", "Home/TempUpload", new { employeeId = Model.Id, trainId= @training.Id }, FormMethod.Post, new { enctype = "multipart/form-data", id = "fileForm" }))

Razor では、ID に @ を追加する必要があるため、次のようになります。

@using (Html.BeginForm("fileForm", "Home/TempUpload", 
new { employeeId = Model.Id, trainId= @training.Id }, FormMethod.Post, 
new { enctype = "multipart/form-data", @id = "fileForm" }))
于 2013-07-03T20:48:38.360 に答える