我有一篇课文:
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
的,这样你的 StringLengthArticle.Text
就可以确定。意思是,这篇文章只能有一定数量的字符,这取决于作者的“标题”。示例:Title.Name
“Title1”只能写一篇 1000 个字符(MaxChar
)的文章,Title.Name
“Title2”可以写一篇 3000 个字符的文章。所以。这意味着字符串长度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 会处理这个问题。