У меня есть статья класса:
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
. Это означает, что эта статья может иметь только определенное количество символов, в зависимости от того, какой «Заголовок» имеет писатель. Пример: Title.Name
«Title1» может написать статью только с 1000 символов (MaxChar
), а Title.Name
«Title2» может написать статью с 3000 символов. Так. Это означает, что длина строки для Article.Text
должна быть от Title.MaxChar
.
Сущность Title
- это данные с префиксом, которые будут храниться в базе данных.
Вот что я сделал раньше: заголовки из базы данных перечислены в представлении со ссылкой для создания действия ArticleController со строкой запроса «title»:
@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
как строку запроса и вообще не иметь никаких отношений между моделями. Просто кажется немного глупым / webforms kindda.
Ваше здоровье
ОБНОВЛЕНИЕ №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 позаботится об этом.
Create
представление. Вы включаете Title.Id в качестве скрытого поля в вашем представлении? В противном случае Title.Id не будет отправлен обратно в действие Create POST, что приведет к добавлению новой записи Title. - person counsellorben   schedule 14.09.2011