質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

4553閲覧

ASP.NET MVCでValidationのまえに値を補充したい

cancat

総合スコア313

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2017/05/23 00:55

こんにちは。
Windows10でASP.NET MVCのアプリケーションを開発しています。
Visual Studio 2017 Communityを使っています。

###前提・実現したいこと
Edit.cshtmlでSubmitを押したときに、inputのvalueが空なら自動的に値を補充したいです。

###試したこと
Edit.cshtmlでuserの情報を編集・更新する機能を作っています。
user(Model)の情報には、passwordの項目(string)があります。
ここにabc123という値が入っているとします。

Edit.cshtmlでは、passwordを表示するtextboxに空のtextboxを用意します。
これでsubmitすると、
空のとき->変更なしとするので、自動的にabc123を入力する。
空でないとき->passwordを変更するので、入力した値(def234)を新規のpasswordに設定する。
というようにしたいです。

値を補充するために、UserModelには、HiddenPasswordの項目を作りました。

###発生している問題・エラーメッセージ
View->Controllerで、
//値がないときは補充
if (string.IsNullOrEmpty(user.Password))
usermodel.Password = usermodel.ConfirmPassword = usermodel.HiddenPassword;
で値を補充しています。
補充できていることは確認できました。
ところが、タイミング的に期待する
ButtonSubmit(View->Contorller)
値補充
ModelStateのValidation
ではなく、
ButtonSubmit(View->Contorller)
ModelStateのValidation
値補充
という順番で動いているようです。
そのため、
ModelState.IsValidは、Password, ConfirmPasswordが常に空となっていて、falseになります。

ViewからControllerに処理が渡るときに、Validationの前に値を入れたいのです。
そのようにするには、どこ(Model? View?)にどのように手を加えればよいものでしょうか?
カスタムバリデーションとかですか?
ご示唆いただければ幸いです。

###該当のソースコード

C#

1public class UserModel 2{ 3 public string Id { get; set; } 4 5 [Required] 6 [Display(Name = "UserId")] 7 public string UserId { get; set; } 8 9 [Required(ErrorMessage = "You must enter a New Password.")] 10 [DataType(DataType.Password)] 11 [Display(Name = "Password(must be at least 6 characters long.)")] 12 public string Password { get; set; } 13 14 [Required(ErrorMessage = "You must enter Confirm New Password.")] 15 [DataType(DataType.Password, ErrorMessage = "You must enter Confirm New Password.")] 16 [Display(Name = "Confirm password")] 17 [System.Web.Mvc.CompareAttribute("Password", ErrorMessage = "The password and confirmation password do not match.")] 18 public string ConfirmPassword { get; set; } 19 20 public string HiddenPassword { get; set; } 21}

C#

1Controller->View 2//edit(初期値表示時) 3public ActionResult Edit(string id) 4{ 5 var user = db.Users.Where(u => u.UserId.Trim() == id).FirstOrDefault(); 6 user.ConfirmPassword = user.HiddenPassword= user.Password; 7 return View(user); 8}
cshtml @model Models.UserModel <form action="Edit" method="post"> @Html.AntiForgeryToken() @Html.ValidationSummary() <div class="form-group" style="border-bottom: none; padding-left:20px; width:450px;"> @Html.LabelFor(model => model.UserId) @Html.TextBoxFor(model => model.UserId, new { @placeholder = "E-mail", @class = "form-control" }) </div> <div class="form-group"> @Html.LabelFor(model => model.Password) @Html.PasswordFor(model => model.Password, new { @class = "form-control", @placeholder = "変更する時のみ入力してください。空の場合は更新されません。" }) //<-(A) <input type="password" name="Password" class="form-control" value="@Model.Password" /> //<-(B) </div> <div class="form-group"> @Html.LabelFor(model => model.ConfirmPassword) @Html.PasswordFor(model => model.ConfirmPassword, new { @class = "form-control", @placeholder = "変更する時のみ入力してください。空の場合は更新されません。" })//<-(A) <input type="password" name="ConfirmPassword" class="form-control" value="@Model.Password" />//<-(B) </div> <input type="hidden" name="HiddenPassword" class="form-control" value="@Model.HiddenPassword" /> <input class="btn btn-primary" type="submit" value="保存" />

(A), (B)などいろいろ試してみました。

C#

1View->Controller 2 3[HttpPost] 4[ValidateAntiForgeryToken] 5public ActionResult Edit(UserModel user) 6{ 7//値がないときは補充 8 if (string.IsNullOrEmpty(user.Password)) 9 usermodel.Password = usermodel.ConfirmPassword = usermodel.HiddenPassword; 10 11 if (ModelState.IsValid) { 12 db.Entry(user).State = EntityState.Modified; 13 db.SaveChanges(); 14 RedirectToAction("Index"); 15 } 16 return View(); 17}

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

カスタム検証を実装しました。

投稿2017/05/23 05:30

cancat

総合スコア313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問