2016-12-30 2 views
0

asp.netコアのかみそりを使用します。私の現在のif文は間違っていますが、エラーメッセージを表示する唯一の方法です。現在のifステートメントは、ModelStateが有効な戻り値でない場合です。新しいビューには、エラーメッセージが表示されます。しかし、私が望むのは、ModleStateがIndex.cshtmlページへの有効なリダイレクトではなく、エラーを表示している場合です。私がif条件を反転させると、エラーメッセージはIndex.cshtmlページに表示されません。@ Html.ValidationSummaryは間違ったページで動作します

ここは私のコントローラです。ここで

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Microsoft.AspNetCore.Mvc; 
using quotingDojo.Models; 

namespace quotingDojo.Controllers 
{ 
    public class HomeController : Controller 
    { 
     // GET: /Home/ 
     [HttpGet] 
     [Route("")] 
     public IActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     [Route("quotes")] 
     public IActionResult Quotes(Home model) 
     { 
      if(!ModelState.IsValid) 
      { 
       return View(); 
      } 
     //continue your code to save 
     return RedirectToAction("Index"); 
     }  
    } 
} 

は、ここに私のIndex.cshtml

@model quotingDojo.Models.Home 
<h1>Welcome to the Quoting Dojo</h1> 
@using(Html.BeginForm("Quotes","Home")) 
{ 
    <p>@Html.ValidationSummary()</p> 
    <p> 
     <label>Your Name</label> 
     @Html.TextBoxFor(s=>s.Name) 
     @Html.ValidationMessageFor(s => s.Name) 
    </p> 
    <p> 
     <label>Your Quote</label> 
     @Html.TextAreaFor(d=>d.Quote) 
    </p> 
    <input type="submit" name="submit" value="Add my quote!"/> 

} 
<form action="quotes" method="get"> 
    <input type="submit" name="submit" value="Skip to quotes!"/> 
</form> 

あるエラーメッセージは、現在まで見せる私のQuotes.cshtmlです。ここで

<h1>Test</h1> 
<p>@Html.ValidationSummary()</p> 

はSystem.ComponentModel.DataAnnotationsを使用して、私のモデルのページ です。

namespace quotingDojo.Models 
{ 
    public class Home 
    { 
     [Required(ErrorMessage ="Please enter your name")] 
     [DataType(DataType.Text)] 
     [MinLength(3)] 
     public string Name {get; set;} 

     [Required] 
     [MinLength(5)] 
     public string Quote{get; set;} 
    } 
} 

答えて

1

あなたの問題はここにある:あなたのアクションメソッドがQuotes命名されているので、「引用」という名前のビューを(これはMVCの規約である)を返します

return View(); 

。また、ビューが存在していてもエラーを知らないので、モデルを渡すこともありません。あなたの問題を解決する

二つの方法:

1.

あなたが明示的Indexビューを返すために必要があるので、あなたのIndexビューにモデルを渡す必要があります。

if(!ModelState.IsValid) 
{ 
    return View("Index", model); 
} 

2.

私は個人的にはこの方法を好みます。それらの両方のリターンこう

// GET: /Home/ 
[HttpGet] 
[Route("")] 
public IActionResult Quotes() { 
    return View(); 
} 

[HttpPost] 
[Route("quotes")] 
public IActionResult Quotes(Home model) { 
    if(!ModelState.IsValid) { 
     return View(model); 
    } 
    //continue your code to save 
    return RedirectToAction("Index"); 
} 

:あなたはに投稿されたものと同じ元のフォームを提供していますあなたの最初のアクションに名前を付け、その後、あなたはこれを(注:また、ビューの名前を変更する必要があります)を行うことができますQuotesという名前のビューは明示的に言及する必要はありません。

0

標準的な方法は、モデルの状態が有効でない場合、あなたは検証エラーメッセージが表示されます同じビュー(ユーザー提出)を返し、です。あなたはIndexアクションメソッドにあなたのQuotesアクションメソッドを変更する必要があります。

[HttpPost] 
[Route("quotes")] 
public IActionResult Index(Home model) 
{ 
    if (!ModelState.IsValid) 
     return View(); 
    // to do :continue saving 
} 

このアクションを投稿するには、フォームを更新してください。

あなたはerrrosを表示する別のページにリダイレクトしたい理由はわかりません。

RedirectToActionメソッド呼び出し(したがって全く新しいGET呼び出し)によって読み込まれた別のビューにエラーメッセージを絶対に表示したい場合は、エラーを転送するためにTempDataを使用する必要があります。

public ActionResult Quotes(Home model) 
{ 
    if (!ModelState.IsValid) 
    { 
     List<string> errors = new List<string>(); 
     foreach (var modelStateVal in ViewData.ModelState.Values) 
     { 
      foreach (var error in modelStateVal.Errors) 
      { 
       errors.Add(error.ErrorMessage); 
      } 
     } 
     TempData["errors"] = errors; 
     return RedirectToAction("Index"); 
     } 
     //continue your code to save 

} 

そして、あなたのインデックスビューで、

@if (TempData["errors"] != null) 
{ 
    var errors = (List<string>) TempData["errors"]; 
    foreach (var error in errors) 
    { 
     <span class="alert warning">@error</span> 
    } 
} 
+0

彼はそれを行う必要はありません。 MVCはモデル状態からエラーを拾い上げます。 – CodingYoshi

+0

いいえ。RedrectResultをIndexに戻す場合、ブラウザはIndexへの全く新しいHTTP GET呼び出しを行います。したがって、TempDataを使用してエラーを転送する必要があります。モデルステート辞書は空になります(HTTPはステートレスです。以前の呼び出しが何であったかは分かりません)。 – Shyju

+0

しかし、彼はすべてを保存してから、インデックスビューに戻したいだけです。言い換えれば、彼はこのコメント「//あなたのコードを保存して続ける」という意味を持っています。ここで彼は保存を行い、リダイレクトします。 – CodingYoshi

関連する問題