2017-05-15 18 views
0

私はカミソリのページにフォームと部分的なビューを持っています。つまり、ドロップダウンリストを変更すると、コントローラはいくつかの作業を行い、部分ビューをトリガーするViewBag.ShowAlert(ブール)を設定します。表示されます。PartialViewは挿入ではなくリダイレ​​クト

部分表示内にコードを表示するだけでなく、部分表示は同じビューではなく新しい表示として表示されます。

理由は何ですか?

ビューHttpPostを扱うコントローラがこの

[HttpPost] 
    public PartialViewResult AlterVote(Dropdown dropType) 
    { 
     ChangeBoilerPlate(dropType.SelectedType); 
     dropType.CurrentType = VoteTypeNames[(int)HomeController.VoterModel.CurrentVoteType]; 
     return PartialView("VotingChange", dropType); 
    } 

あるこの

@using (Html.BeginForm("AlterVote", "ChangeVoteType")) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h1>New voting preference</h1> 
    <hr /> 

    <p>Please select the type of vote you wish to change to @Html.DropDownListFor(model=>model.SelectedType, ViewBag.myList as SelectList, "Voting type", new { onchange = "this.form.submit();"})</p> 

    <div id="partialDiv"> 
     @if (ViewBag.ShowAlert) 
     { 
      @Html.Partial("VotingChange") 
     } 
    </div> 
</div> 
} 

のように見える私はこれがダウンして最初のビューはフォームであることにあるので、部分的に取得することを推測していますビューを挿入する場所については混乱しています。

+1

'onchange =" this.form.submit(); "これはフォーム提出とそれに続くナビゲーション(新しいビュー)をトリガします。ページ要素 '#partialDiv'を更新するためには、AJAXリクエストをトリガし、レスポンスを処理する必要があります。 – Jasen

答えて

1

私が正しく理解している場合、the partial view shows as a new viewによって、htmlタグbodyと完全なレイアウトが再び付いてくることを意味します。これを解決するために、あなたはあなたの部分図の内側nullにレイアウトを設定する必要があり、そのよう:

@model YourNamespace.Dropdown 

@{ 
    Layout = null; 
} 

<!-- partial view html below --> 
<div> 
</div> 

divタグはただ説明することです。

問題が解決する可能性がありますが、ページ全体を再読み込みせずに部分表示を読み込みたい場合があります。これはそうのような、AJAXを使用して可能である:

メインビュー

@using (Html.BeginForm("AlterVote", "ChangeVoteType")) 
{ 
@Html.AntiForgeryToken() 

<div class="form-horizontal"> 
    <h1>New voting preference</h1> 
    <hr /> 

    <p>Please select the type of vote you wish to change to @Html.DropDownListFor(model=>model.SelectedType, ViewBag.myList as SelectList, "Voting type", new { id = "vote"})</p> 

    <div id="partialDiv"> 
    </div> 
</div> 
} 

<script type="text/javascript"> 
    $(document).ready(function() { 
    $('#vote').change(function() { 
     var selectedType = $(this).val(); 
     $.post('yourserver/YourController/AlterVote', { "SelectedType": selectedType }) 
     .done(function (data) { 
      $('#partialDiv').html(data); 
     }) 
     .fail(function() { 
      console.log('Whoops, something went wrong!!!'); 
     }); 
    }); 
    }); 
</script> 

だから私はちょうど私はちょうど、あなたのdropdrownに、代わりにフォームを送信することと同じ変更イベントを聞くためにJavaScriptを追加しましたajaxを使用してページ全体を再ロードせずに部分ビューhtmlを読み込みます。

URLを修正するだけで、レイアウトを部分ビューでnullに設定することを忘れないでください。また、このjavascriptを別のファイルに入れてバンドルをロードすることもできます。

+0

それはクールな答えです - ありがとう。問題ChangeVoteTypeController/AlterVoteが404を与えているのに(サーバーのルートにあるので、完全な[testing] URLは127.0.0.1:8080/ChangeVoteTypeController/AlterVoteです。)AlterVoteは[HttpPost ]コントローラ内で – Nodoid

+0

@Nodoidなので 'HttpPost'だからブラウザでurlを開くことはできないので、asp.net mvcの予想される動作は404を出力することです。あなたは 'HttpGet'に一時的にアクションを変更します(' Dropdown'パラメータを削除してテスト用に固定値を使うこともできます)。ブラウザで確認してから 'HttpPost'に再度変更しますjavascriptメソッドをテストします。同じサーバーの場合は、 '/ ChangeVoteTypeController/AlterVote'をurlとして設定し、ブラウザのコンソールでエラーをチェックしてください。 – Alisson

関連する問題