0

私はクラスの記事を持っています:

    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 文字の記事を作成できます。そう。つまり、 の文字列の長さは から取得する必要があります。MaxCharTitle.NameArticle.TextTitle.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がそれを処理する必要がない場所を読んだことは間違いありません。

4

2 に答える 2

1

Create最も簡単な方法は、おそらくアクションのコンテキストにタイトルを付けることです。

// ...
if (ModelState.IsValid)
{
    db.Titles.Attach(article.Title);
    db.Article.Add(article);
    db.SaveChanges();
    return RedirectToAction("Index");
}
// ...

Attacharticle.Titleデータベースにすでに存在するEFに通知します。これによりTitle、記事をコンテキストに追加するときに新しいものが挿入されるのを防ぎます。

于 2011-09-14T14:01:20.767 に答える
1

MVC モデルとエンティティ モデルを区別する必要があります。MVC Article モデルは次のようになります (モデルに何が入るかについては宗教的な議論があることに注意してください)。

public class Article
{
    public int Id { get; set; }
    public string Text { get; set; }
    public int TitleID { get; set; }
    public IEnumerable<Title> AvailableTitles {get;set;}
}

ビューで、利用可能なタイトルに基づいてドロップダウンを作成し、それを TitleID プロパティにバインドできます。使用可能なタイトルのリストは、パラメーターなしのコントローラー メソッド (およびモデル バインド メソッド) に入力されます。

モデルにバインドされたメソッドが TitleID を返す場合、ID に基づいて Entities フレームワークから Title オブジェクトをインスタンス化します。その Title オブジェクトを使用して Entities Article オブジェクトを作成し、変更を保存します。これにより、目的の場所に移動できるはずです。

于 2011-09-14T13:50:00.303 に答える