前提・実現したいこと
入力された内容に対して入力チェックを行った後にDB問合せを行いたいが自分のコードだと入力チェックを行わずそのままコントローラのコードに移動してしまいます。
ソースコードは現在学習として作成している画面でDB問合せを行い商品を登録・削除・更新を行うといったものです。下記コードは新規登録に関してのコードです。お聞きしたいことは
・JavaScriptの入力チェックを呼び出した後にcontrollerのコードに移動できるのか、またそれを行うにはどういった手段があるのか
・上記手段がダメとするならどのような手段があるのか
です。宜しくお願い致します。
該当のソースコード
csHTML
1@model ProductManage.Models.Insert 2 3@{ 4 Layout = null; 5} 6 7<!DOCTYPE html> 8 9<html> 10<head> 11 <meta name="viewport" content="width=device-width" /> 12 <title>商品情報登録</title> 13 <link href="@Url.Content("~/Content/add.css")" rel="stylesheet" type="text/css" /> 14</head> 15<body> 16 <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script> 17 <script src="@Url.Content("~/Scripts/add.js")" type="text/javascript"></script> 18 @using (Html.BeginForm("add", "Home", null, FormMethod.Post, new { enctype = "multipart/form-data" })) 19 { 20 <table> 21 <tr> 22 <td><span>商品名</span></td> 23 <td><input type="text" size="20" autocomplete="off" name="productName"></td> 24 </tr> 25 <tr> 26 <td><span>種類</span></td> 27 <td> 28 <select name="option"> 29 <option value="0"></option> 30 <option value="1">本体</option> 31 <option value="2">オプション</option> 32 <option value="3">その他</option> 33 </select> 34 </td> 35 </tr> 36 <tr> 37 <td><span>価格</span></td> 38 <td><input type="text" size="10" autocomplete="off" name="price"></td> 39 </tr> 40 <tr> 41 <td></td> 42 <td> 43 <input type="submit" value="新規登録" onclick="return check();" class="submit"> 44 </td> 45 </tr> 46 </table> 47 } 48</body> 49</html> 50
JavaScript
1const errorTitle = "入力チェックエラー"; 2const Null = "全項目入力必須です"; 3const productNameCheck = "商品名は16文字以下です"; 4 5function check() { 6 var productName = addCheckForm.productName.value; 7 var option = addCheckForm.option.value; 8 var price = addCheckForm.price.value; 9 10 if (productName == "" || option == 0 || productPrice == ""){ 11 swal(errorTitle,Null); 12 return false; 13 } 14 15 if (productName.length > 16){ 16 swal(errorTitle,productNameCheck); 17 return false; 18 } 19 20 return true; 21}
C#(MVCのcontroller)
1using ProductManage.Models; 2using System.Web.Mvc; 3 4namespace ProductManage.Controllers 5{ 6 public class HomeController : Controller 7 { 8 [HttpGet] 9 public ActionResult login() 10 { 11 return View(); 12 } 13 14 [HttpGet] 15 public ActionResult list() 16 { 17 return View(); 18 } 19 20 [HttpPost] 21 public ActionResult list(ListDisplay model) 22 { 23 DBaccess result = new DBaccess(); 24 var ResultList = result.Serch(model); 25 return View(ResultList); 26 } 27 28 [HttpGet] 29 public ActionResult add() 30 { 31 return View(); 32 } 33 34 [HttpPost] 35 public ActionResult add(Insert model) 36 { 37 DBaccess result = new DBaccess(); 38 var ResultList = result.Insert(model); 39 return View(); 40 } 41 } 42} 43
試したこと
@using(html.beginform)ではなくhtmlのformで対処する
↓
入力チェックは行われたがcontroller側が反応しなかった恐らく
[HttpGet]
public ActionResult add()
{
return View();
}
の方に行ってしまっていると考えています。
根拠としては足りないですがブレイクポイントを上記コードの下の本来行くはずの所につけて反応しなかったからです。
上記以外で出来そうな手段を考えて検索しましたが該当するものが見つかりませんでした。
考えた手段として
・controller側でjavascriptの関数を呼び出せるのではないか
・Ajax通信等の手段を使って行えないか
補足情報(FW/ツールのバージョンなど)
vmware14 windows10
asp.net WebApplication mvc
VisualStudio2015
解決方法 modelにDataAnnotationsを追加する
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel.DataAnnotations; 4using System.ComponentModel; 5 6namespace ProductManage.Models 7{ 8 public class Insert 9 { 10 [Required(ErrorMessage = "商品名は必須入力です")] 11 [StringLength(16, ErrorMessage = "16文字以内で入力してください")] 12 public string productName { get; set; } 13 14 [Range(1, 3, ErrorMessage = "オプションは入力必須です")] 15 public int option { get; set; } 16 17 [RegularExpression(@"[0-9]+", ErrorMessage = "半角数字のみ入力できます")] 18 public int price { get; set; } 19 } 20}
対象のcontrollerで下記を追加
C#
1if (ModelState.IsValid) 2{ 3//ここに正常時のコードを記載 4}
HTMLで
HTML
1 @Html.ValidationMessageFor(model => model.productName)
を追加して無事表示されるようになりました。
回答1件
あなたの回答
tips
プレビュー