2012-01-13 4 views
0

新しいアイテムを作成するために、次のビューを作成しました。 Iveは少し検証を作成しようとしました。ユーザーがフィールドを空白のままにしておくと、検証メッセージが生成されます。ただし、ユーザーがフィールドを空白のままにした場合、アプリケーションは、Model.Designer.csファイルの_headline = structuralObject.SetValidValue(value, false)行でクラッシュします。理由は次のとおりです。検証によるアプリケーションのクラッシュ - 'このプロパティはnull値に設定できません'

このプロパティはNULL値に設定できません。

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 

    <legend>News Details</legend> 

    <br /> 
     Posted Date: 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.posted) 
       @Html.ValidationMessageFor(model => model.posted) 
      </div> 

    <br /> 

     Headline Title: 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.headline) 
       @Html.ValidationMessageFor(model => model.headline) 
      </div> 

    <br /> 

:私のビューを作成し、以下のように

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.String headline 
    { 
     get 
     { 
      return _headline; 
     } 
     set 
     { 
      OnheadlineChanging(value); 
      ReportPropertyChanging("headline"); 
     _headline = StructuralObject.SetValidValue(value, false); 
      ReportPropertyChanged("headline"); 
      OnheadlineChanged(); 
     } 
    } 

コードのセクションこれが適用される:私のModel.Designer.csの一部のファイルが

以下は私のAccountModels.csファイルで、Viewの検証を入力した場所です:

[MetadataType(typeof(NewsValidation))] 

public partial class News 
{ 
} 

public class NewsValidation 
{ 

    [Required(ErrorMessage = "Posted date is required")] 
    public DateTime posted { get; set; } 

    [Required(ErrorMessage = "Headline is required")] 
    [Display(Name = "Headline")] 
    public string headline { get; set; } 

    [Required(ErrorMessage = "Story body is required")] 
    public string story { get; set; } 
} 

私のデータベースではNull値が許可されていると言われましたが、それ以来Nullを許可しない新しいデータベースを作成しました。私のアプリケーションはまだクラッシュし、どこから起動するのか分からない。奇妙なことがあります。クラッシュすると再生が続行され、検証が表示されます。したがって、検証は機能しているように見えますが、何らかの理由で事前にアプリケーションがクラッシュすることがあります。

誰でもサポートできますか?

+0

MVCについてよく分かりませんが、「IsNullable = false」の部分が問題を引き起こしてはいけませんか? – PedroC88

+0

私はそれを試みますが、Model.Designer.csファイルは自動的に生成されます。ありがとうございます:-) – Blob

答えて

0

問題は、ドメインモデル上headlineプロパティのセッターは更新を実行しようとしていることです。このセッターは、要求からアクション引数をバインドしようとすると、デフォルトのモデルバインダーによって呼び出されます。また、ユーザーが見出しフィールドを空白のままにすると、この例外が発生します。

ビューモデルを使用し、ドメインモデルをビューに渡すことは絶対にお勧めします。だから、簡単なNewsViewModel定義:

public class NewsViewModel 
{ 
    public DateTime Posted { get; set; } 

    [Required] 
    public string Headline { get; set; } 
} 

をしてからコントローラのアクションは、ビューに渡しています

public class HeadlinesController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new NewsViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(NewsViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // there were validation errors. For example the user 
      // left the headline field blank => redisplay the view 
      return View(model); 
     } 

     // at this stage we know that validation passed => we can 
     // process our domain model. 
     var news = new News(); 
     news.posted = model.Posted; 
     news.headline = model.Headline; 

     return RedirectToAction("success"); 
    } 
} 

と明らかビューは強くあなたのビューモデルに入力することになります。

@model NewsViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>News Details</legend> 

     <br /> 
     Posted Date: 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Posted) 
      @Html.ValidationMessageFor(model => model.Posted) 
     </div> 

     <br /> 

     Headline Title: 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Headline) 
      @Html.ValidationMessageFor(model => model.Headline) 
     </div> 

     <br /> 

     <button type="submit">OK</submit> 
    </fieldset> 
} 
+0

私の現在の「作成」ビューはあなたのものとは違って見えますが、上記は適用されますか? [HttpPost、ValidateInput(偽)] 公共のActionResultの作成(ニュースニュース) {IF(ModelState.IsValid) {VAR latestStory = _db.News.OrderByDescending(N => n.storyId).FirstOrDefault(); var nextStoryId = latestStory.storyId + 1; news.storyId = nextStoryId; _db.News.AddObject(news); _db.SaveChanges(); TempData ["StoryCreated"] = "新しいストーリーが作成されました"; リターンRedirectToAction( "UniversityHomepage"); } 戻る表示(ニュース); } – Blob

+0

@ user1091114、いいえ、あなたのコントローラアクションの引数としてNewsを使用しないでください。それが問題です。デフォルトのモデルバインダーは、セッターを呼び出します。そしてセッターはあなたがそれを実装した方法でクラッシュします(実際にはあなたではなく、自動生成されたファイルにあります)。私の答えで説明したようにNewsViewModelを定義し、このビューモデルを使用する必要があります。 –

+0

私のアプリケーションを実行すると、IEのウィンドウで次のようなメッセージが表示されます: '辞書に渡されたモデルアイテムは' File.Models.NewsViewModel 'タイプですが、この辞書には' File.Models.News ' 。 説明:現在のWeb要求の実行中に、未処理の例外が発生しました。エラーの詳細とコード内のどこで発生したのかについては、スタックトレースを確認してください。 それは私がやっているからです:リターンビュー(モデル); Return View()の代わりに? – Blob

0

アプリケーションがクラッシュした場合しかし、あなたはプレーをクリックすることができ、それは喜んで運び、検証を行い、あなたのデバッグは、すべての例外がスローされただけではなく、ユーザーが未処理のものを表示するように設定されていますか?おそらくStructuralObject.SetValidValue()はフロー制御の例外を使用しています。

  1. デバッグに行く>例外
  2. あなたは(のみ管理)マイコードのみ
  3. を有効にツール]> [オプション]> [デバッグ]> [全般に行き、確認し、「ユーザー・未処理」列を持っていない場合デバッグでは>例外は、「スローさ」オフにして、共通言語ランタイム例外

ただ、勘の下で「ユーザー-未処理」をチェック - それはすべての違いを作るのですか?

+0

こんにちはSteve、 これは処理の前に検証を選択していないので、これは私のコードの問題です。ユーザー例外:C++例外、共通言語ランタイム例外、マネージデバッグアシスタント、ネイティブランタイムチェック、およびWin32例外はすべて、「ユーザー未処理」の下にあるティックを持っています。 NonはThrownにチェックされています。 「自分のコードを有効にする(管理のみ)」もチェックされています。 返信いただきありがとうございます:-) – Blob

関連する問題