2017-03-07 10 views
0

私は学生用ページに新しいを作成して、別のページに移動する代わりにブートストラップを使用してモーダルポップアップとして表示したい新しい生徒を作成します。学生。アクションリンクのブートストラップモーダルポップアップが表示されない

現在、Html.ActionLinkとして機能していますが、ポップアップの本文にフォームを表示するのが難しいです。後でそれを使ってAJAXでデータを挿入したいが、最初にモーダルポップアップを実装したい。

<script src="~/Scripts/jquery-3.1.1.js"></script> 
<link href="~/Content/bootstrap.css" rel="stylesheet" /> 
<script src="~/Scripts/bootstrap.js"></script> 
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" /> 

@if (User.IsInRole("Admin")) 
{ 
    <p class="btn btn-primary" data-toggle="modal" data-target="#myModal"> 

     @Html.ActionLink("Create New", "Create", null, new { @id = "create" }) 

     <div class="modal fade" id="myModal"> 
      <div class="modal-dialog"> 
       <div class="modal-content"> 

        <div class="modal-header"> 
         <a href="#" class="close" data-dismiss="modal">&times;</a> 
         <h3 class="modal-title">Create Modal</h3> 
        </div> 

        <div class="modal-body"> 
         @Html.ActionLink("Create New", "Create", null, new { @id = "create" }) 

        </div> 

        <div class="modal-footer"> 
         <a href="#" class="btn btn-default" data-dismiss="modal">Cancel</a> 
         <a href="#" class="btn btn-success" >Create</a> 

        </div> 
       </div> 
      </div> 
     </div> 
    </p> 

はStudentController

[Authorize(Roles = "Admin")] 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "ID,LastName, FirstMidName, EnrollmentDate, PaymentDue")] 
      Student student) 
     { 
      try 
      { 
       if (ModelState.IsValid) 
       { 
        studentRepository.InsertStudent(student); 
        studentRepository.Save(); 
        return RedirectToAction("Index"); 
       } 
      } 
      catch (DataException /* dex */) 
      { 
       //Log the error (uncomment dex variable name after DataException and add a line here to write a log. 
       ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, and if the problem persists contact your system administrator."); 
      } 
      return View(student); 
     } 

答えて

1

モーダル内にフォームを配置したいが、その上にフォームを持つ別のページにアクションリンクを配置しているので、問題があります。フォームをコピーして、必要のないページを外して、それをモーダルの本体の中に貼り付ける必要があります。ここでフォームを送信すると、コントローラ内のフォームが指し示すアクションがヒットし、そのアクションはフォームデータを処理し、ページをリフレッシュすることができます。したがって、フォーム・アクションを編集して、索引ビューへのリダイレクトや、このモーダルを持つビューを編集する必要があります。おそらくあなたはページをリフレッシュさせたくないので、おそらくあなたはajaxの使用を考えていると言いました。とにかく、私はあなたのフォームがどのように見えるか、あなたのHttpPostアクションがわからないので、模擬フォームをここに作ります。 P.S.私は電話で入力しています。

もう一度やり直してください。

投稿入力はあなたのフォームを提出し、あなたがURLで指定した行動への投稿を行います。あなたが検証要約または抗偽造トークンが必要な場合、私は知らない

@using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post, 
            new { enctype = "multipart/form-data" })) 
    { 

     <div class="modal-body"> 
     First name: <input type="text" name="fname">  <br> 
     Last name: <input type="text" name="lname"><br>   
     </div> 
     <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 

    <input type="submit" class="btn btn-success pull-right" value="Save">  
    </div> 

} 

:これは本質足すと同じです。コピーしたいフォームをチェックする必要があります。

次に、あなたの行動は次のようになります:

public class ControllerName : Controller 
{ 
    public ActionResult Index() 
    { 
     // Add action logic here 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult ActionName(string fname, string lname) 
    { 
     // do something with fname and lname. Thenaming of your html inputs and the parameters you recieve here are important. If the post action has a required parameter that you do not post it will give you a 404 or something. 

     //redirec to whatever page has the modal on 
     return View("Index") 
    }  
} 

回答は、編集:

だから状況のために私が作成したフォームのバックモデルを渡すことを忘れることをお勧めします。モデルを作成ページに返す理由は、ユーザーがフォームに記入して保存にエラーがある場合、アクションは、ユーザーが記入したすべてのフィールドを含むオブジェクトを返します。すべてが再び出てくる。これは、フォームのHttpPostアクションで確認できます。最初にエントリを作成するときは、モデルを必要としません。なぜなら、とにかくすべてのフィールドを空にするからです。 (FYI - モデルを "編集"ページに戻す明白な必要性を認識する必要があります。なぜなら、既にデータベースに保存されている値を編集しているからです。)したがって、あなたの選択です。保存に失敗した場合は、ビューモデルを使用する必要があります。それ以外の場合は、標準のHTMLフォームを作成して、それをあなたの行動に投稿することができます。私はここでそれの例をすることができます。ここで

は、フォームである:ここでは

@using (Html.BeginForm("Create", "ControllerName", FormMethod.Post, 
            new { enctype = "multipart/form-data" })) 
    { 
    @Html.AntiForgeryToken() 
     <div class="modal-body"> 
     First name: <input type="text" name="FirstMidName">  <br> 
     Last name: <input type="text" name="lname"><br>   
     //do you need a date picker here???? 
     Enrollment Date: <input type="text" name="EnrollmentDate"><br> 

     Payment Due: <input type="text" name="PaymentDue"><br> 

     </div> 
     <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 

    <input type="submit" class="btn btn-success pull-right" value="Save">  
    </div> 

} 

は、コントローラは次のとおりです。目安ザッツ

[Authorize(Roles = "Admin")] 
    [ValidateAntiForgeryToken] 
    [HttpPost] 

    public ActionResult Create(string LastName, string FirstMidName, string EnrollmentDate, string PaymentDue) 
    { 

     // If you do not have validation on the front end you at tge very least need to put some null checks here based on you required fields. I remover the model state check as we are not passing through a model anymore. So: 
     if (FirstMidName != ""){ 
     try 
     { 
      Student student = new Student(); 
      student.LastName = LastName; 
      student.FirstMidName = FirstMidName; 

      //you need to handle how this date is parsed here 
      student.EnrollmentDate =DateTime.Parse(EnrollmentDate); 

      //if this is a bool you may need to do some logic here depending on what values your form gives you. Maybe if (PaymentDue == "checked"){student.PaymentDue = true} else { student.PaymentDue = false} 
      //if payment due is monetry value you must be very catefull about the way you parse decimals/floats with the decimal point and culturr information. You will need to do some research here. 
    student.PaymentDue = PaymentDue; 

       studentRepository.InsertStudent(student); 
       studentRepository.Save(); 
       return RedirectToAction("Index"); 
      } 
     } 
     catch (DataException /* dex */) 
     { 
      //Log the error (uncomment dex variable name after DataException and add a line here to write a log. 
      ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, and if the problem persists contact your system administrator."); 
     } 
     } 
     //see i removed the old return view with a model here which was incase there was a problem saving. 
     return RedirectToAction("Index") ; 
    } 

。私の電話帳でtyping。私はexsisting作成フォームからすべてのバリデーション要素をコピーし、バリデーション要約を含む新しいフォームモーダルに貼り付けることをお勧めします。既存のフォームをクロームで開き、右クリックしてページソースを表示し、そこからフォームのレンダリングされたHTMLをコピーして、既存の検証と入力を失わないようにすることができます。しかし、もしあなたが好きなら、@ html.Beginformとantiforgerytokenを保管しておいてください。あなたはすぐに型抜きすることはできませんビューモデルを使用しています!

+0

情報ありがとうございます。私はjQueryとAJAXにはとても新しいので、私はその周りに頭を抱えようとしています。モーダルポップアップを作成するためにjQueryを使用する必要がある場合は、ポストにレイアウトの形式を変更しますか? – Truecolor

+0

いいえ、フォームをページに正しく設定している限り、jqueryまたはデフォルトのブートストラップを使用するかどうかは関係ありません。しかし、私はデフォルトのブートストラップモーダルを使用することをお勧めします、それは正常に動作します。フォームに入れたボタンは送信を行うため、私はモーダルで閉じるボタンを編集したことにも注意してください。だから、私はそれをアンコルタグに変えます。 – Harry

+0

あなたが言及したように、私はViewで複数のモデル参照を使用することができないので、モーダルボディセクションでbeginフォームを使用する際に問題が生じます。通常のHTMLフォームを作成しようとすると、バリデータまたはAntiForgeryの作成に問題があります。 – Truecolor

0

でアクションを作成します。私はあなたのモーダルを取得するためのボタンを作成することをお勧めします。 <button type="button" class="btn btn-info btn-sm" data-toggle="modal" data-target="#myModal">Open Modal</button>、ボタンをアクションリンクのように表示したい場合は、cssで実行できます。

1

JSフックとブートストラップボタンクラスはどちらでもサポートされていないpタグに適用しています。あなたのリンクが代わりにこれらを持っている必要があります。

@Html.ActionLink("Create New", "Create", null, new { id = "create", @class = "btn btn-primary", data_toggle = "modal", data_target = "#myModal" }) 
+0

ありがとうございます、今はポップアップボックスを表示しています。しかし、それはサイトの完全な 'nav-bar'を表示していて、ヘッダーのクローズオプションのための 'X'やフッターの' cancel'ボタンを表示していませんか? – Truecolor

0

をあなたはモーダルポップアップを開くためにjQueryのを使用したい場合は

JS

$(function() { 
      $('#create').on('click', function (e) { 
       e.preventDefault(); 
       $('#myModal').modal('show'); 
      }); 
     }); 

HTML

<body> 
    @Html.ActionLink("Create New", "Create", null, new { @id = "create" }) 

    <div class="modal fade" id="myModal"> 
     <div class="modal-dialog"> 
      <div class="modal-content"> 

       <div class="modal-header"> 
        <a href="#" class="close" data-dismiss="modal">&times;</a> 
        <h3 class="modal-title">Create Modal</h3> 
       </div> 

       <div class="modal-body"> 

       </div> 

       <div class="modal-footer"> 
        <a href="#" class="btn btn-default" data-dismiss="modal">Cancel</a> 
        <a href="#" class="btn btn-success">Create</a> 

       </div> 
      </div> 
     </div> 
    </div> 
</body> 
関連する問題