Раскрытие бритвы .net mvc для внешних ключей - PullRequest
1 голос
/ 16 июня 2011

Ладно, это казалось простым, но у меня кружится голова.

Я создал модели на основе CodeFirst.

public class Category
{
    public int ID { get; set; }

    [StringLength(255, MinimumLength = 1)]
    public string Name { get; set; }
}

public class SubCategory
{
    public int ID { get; set; }
    public Category category { get; set; }

    [StringLength(255, MinimumLength = 1)]
    public string Name { get; set; }
}

Теперь, когда я автоматически генерирую контроллер и вижуПодкатегория это (из коробки) позволяет мне создавать новые объекты Подкатегории без указания категории (даже через нее правильно создает отношение внешнего ключа к таблице категории в БД).

Так что я, хотя и хорошо, я просто опущу выпадающий список в файле create.cshtml и заставлю его использовать это.

Через некоторое время мне удастся добавить это в контроллер:

    public ActionResult Create()
    {
        ViewBag.Categories = new SelectList(db.Category.ToList(),"ID","Name");
        return View();
    } 

и этона вид:

    @Html.DropDownList(model => model.category, "Categories")

Но теперь объект не перехватывает автоматически, что я хочу использовать это для моего внешнего ключа, поэтому, когда я останавливаю код в методе POST, он все равно отображает объект с NULL вполе категории.

Полагаю, мой вопрос двоякий.Как мне это сделать?и если мой метод до сих пор не верен, что мне не хватает?

Я просто хочу, чтобы новый объект, сохраненный в таблице SubCategory, включал внешний ключ для Category.

Надеюсь, что это делаетчувство.

1 Ответ

1 голос
/ 16 июня 2011

Самый простой способ - определить скалярное свойство с именем CategoryId в вашем SubCategory классе

public class SubCategory
{
    public int ID { get; set; }

    public int CategoryID { get; set; }
    public Category category { get; set; }

    [StringLength(255, MinimumLength = 1)]
    public string Name { get; set; }
}

Тогда правильно отобразите это в EF

После этого ставишь

@Html.DropDownListFor(
    model => model.CategoryID, category SelectList instance)
)

Другим вариантом является создание пользовательского связывателя модели для привязки типа Category.

...