モーダル内にフォームを配置したいが、その上にフォームを持つ別のページにアクションリンクを配置しているので、問題があります。フォームをコピーして、必要のないページを外して、それをモーダルの本体の中に貼り付ける必要があります。ここでフォームを送信すると、コントローラ内のフォームが指し示すアクションがヒットし、そのアクションはフォームデータを処理し、ページをリフレッシュすることができます。したがって、フォーム・アクションを編集して、索引ビューへのリダイレクトや、このモーダルを持つビューを編集する必要があります。おそらくあなたはページをリフレッシュさせたくないので、おそらくあなたは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を保管しておいてください。あなたはすぐに型抜きすることはできませんビューモデルを使用しています!
情報ありがとうございます。私はjQueryとAJAXにはとても新しいので、私はその周りに頭を抱えようとしています。モーダルポップアップを作成するためにjQueryを使用する必要がある場合は、ポストにレイアウトの形式を変更しますか? – Truecolor
いいえ、フォームをページに正しく設定している限り、jqueryまたはデフォルトのブートストラップを使用するかどうかは関係ありません。しかし、私はデフォルトのブートストラップモーダルを使用することをお勧めします、それは正常に動作します。フォームに入れたボタンは送信を行うため、私はモーダルで閉じるボタンを編集したことにも注意してください。だから、私はそれをアンコルタグに変えます。 – Harry
あなたが言及したように、私はViewで複数のモデル参照を使用することができないので、モーダルボディセクションでbeginフォームを使用する際に問題が生じます。通常のHTMLフォームを作成しようとすると、バリデータまたはAntiForgeryの作成に問題があります。 – Truecolor