私はクラスの記事を持っています:
public class Article
{
public int Id { get; set; }
public string Text { get; set; }
public Title Title { get; set; }
}
そしてタイトル:
public class Title
{
public int Id { get; set; }
public string Name { get; set; }
public int MaxChar { get; set; }
}
を記述する前に、リストからArticle
選択する必要がTitle
あるため、 StringLength をArticle.Text
決定できます。つまり、この記事には、ライターの「タイトル」に応じて、特定の量の文字しか含めることができません。例: 「タイトル 1」は 1000 文字 ( )Title.Name
の記事しか作成できず、 「タイトル 2」は 3000 文字の記事を作成できます。そう。つまり、 の文字列の長さは から取得する必要があります。MaxChar
Title.Name
Article.Text
Title.MaxChar
Title
エンティティは、データベースに格納されるプレフィックス付きのデータです。
これまでに行ったことは次のとおりです。データベースのタイトルがビューにリストされ、「タイトル」クエリ文字列を使用して ArticleController のアクションを作成するためのリンクが表示されます。
@Models.Title
@foreach (var item in Model) {
@Html.ActionLink(item.Name, "Create", "Article", new { title = item.Id}, new FormMethod())
}
フォームに記入して投稿します。HttpPost 作成アクション:
[HttpPost]
public ActionResult Create(Article article)
{
if (article.Text.Length > article.Title.MaxChar)
{
ModelState.AddModelError("Text",
string.Format("The text must be less than {0} chars bla bla", article.Title.MaxChar));
}
if (ModelState.IsValid)
{
db.Article.Add(article);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(hb);
}
これが問題です。Title
コントローラーは、新しいエンティティも追加します。そのため、次にタイトルを選択する必要があるビューに移動すると、記事を書くために最後に使用したエンティティの複製が表示されます。
まったく新しい方法でこれを行う必要がありますか、それとも小さな調整がありますか。私が考えることができる唯一のことは、をMaxChar
クエリ文字列として送信することであり、モデル間に関係はまったくありません。少しばかげているようです/ウェブフォームのようなものです。
乾杯
更新#1:多分私はこれを間違った方法でやっていますか?作成アクションを取得
public ActionResult Create(int title)
{
var model = new Article
{
Title = db.Title.Find(title)
};
return View(model);
}
それとも、モデルの中にあるのでしょうか? 同様に、外部キーを設定する必要がありますか? 何かのようなもの:
[ForeignKey("Title")]
public int MaxChar { get; set; }
public virtual Title Title { get; set; }
しかし、EFがそれを処理する必要がない場所を読んだことは間違いありません。