2016-12-06 19 views
0

私は現在、基本的なasp.net mvcアプリケーションに取り組んでいます。今日、私は奇妙な問題が発生しました:ModelStateが無効です。オブジェクトは正常ですか?

[HttpPost] 
[Authorize] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create([Bind(Include = "Url, Homepage, Language, Country, Name")]FeedModel feedModel) 
    { 
     feedModel.Id = Guid.NewGuid().ToString();  
     feedModel.UserId = User.Identity.GetUserId(); 

     Debug.WriteLine(feedModel.UserId); 

     if (ModelState.IsValid) 
     { 
      db.Feeds.Add(feedModel); 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(feedModel); 
    } 

はどうやら、ModelState.IsValidが原因ユーザーIDの値がnullであることにVSでデバッグ・ツールに応じて、常にfalseです。ただし、Debug.WriteLineを使用すると、feedModel.UserIdが正しく表示されます。

この関数は、IdおよびUserIdの値を追加して、ビューから情報を受け取ることに関するものです。

これはfeedModelクラスである:私はそこで間違っ

public class FeedModel 
{ 
    [Key] 
    public string Id { get; set; } 
    [Required] 
    public string UserId { get; set; } 
    [Required] 
    public string Url { get; set; } 
    [Required] 
    public string Homepage { get; set; } 
    [Required] 
    public string Language { get; set; } 
    [Required] 
    public string Country { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 

何をしているのですか?

ありがとうございます!

+0

モデルの状態のエラーを繰り返して無効なものを表示しましたか? – Fran

+1

あなたは[モデルを再検証する]必要があります(http://stackoverflow.com/questions/6360087/manually-invoking-modelstate-validation) – Jasen

答えて

4

投稿にはこれらの値(URL、ホームページ、言語、国名、名前)のみがバインドされていますが、必要に応じてモデルにはIdとUserIdがあります。 Model.IsValidは、コントローラのアクションが実行される前のバインド時に設定されます。メソッドのIdとUserIdを設定しても、モデルが無効であるという事実は変わりません。

+0

申し訳ありませんが、迅速な対応に感謝します!今はうまくいっているようですが、[必須]は削除しましたが、後でビューモデルを使用するようにしています。 –

3

モデルバインドのプロセスが行われているときにModelStateが設定されます。 あなたの場合、feedModel.UserId = User.Identity.GetUserId();というステートメントはModelStateを変更しません。したがって、問題です。 バリデーターを使用するようないくつかの異なるメカニズムによって、モデルの妥当性をチェックできます。 別のメカニズムを使用したくない場合は、UserIdプロパティpublic string UserId { get; set; } = User.Identity.GetUserId();のデフォルト値を設定するか、プロパティからRequired属性を削除してModelStateに反映されないようにすることができます。

+3

問題は、efドメインモデルをビューモデルとして使用しようとしているように見えるため、IdとUserIdから[必須]属性を削除できない可能性があります。より良い解決策は、ビューから必要なものだけを含む個別のビューモデルを作成することです。 – Fran

関連する問題