Я разрабатываю небольшое приложение, чтобы лучше понять, как работает MVC3 anda Razor. Я использую MVC3, весь код генерировался автоматически (dbContext через T4, Controller через Add Controller, Databese из модели EDMX ...).DropDownlistFor Создание нового объекта с MVC3
В моей модели у меня есть эта простая модель: http://i.stack.imgur.com/nyqu4.png
public partial class Application
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ApplicationType ApplicationType { get; set; }
}
public partial class ApplicationType
{
public int Id { get; set; }
public string Type { get; set; }
}
Как вы можете видеть, ApplicationType в основном перечисление (жаль, что EF 4 не имеет поддержки перечислений). Так, в моем ApplicationController у меня есть это:
public ActionResult Create()
{
ViewBag.AppTypes = new SelectList(db.ApplicationTypes.OrderBy(c => c.Type), "Id", "Type");
return View();
}
[HttpPost]
public ActionResult Create(Application application)
{
if (ModelState.IsValid)
{
db.Applications.Add(application);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(application);
}
И на мой взгляд:
@Html.DropDownListFor(model => model.ApplicationType.Id, (SelectList)ViewBag.AppTypes, "Choose...")
Теперь я столкнулся с двумя проблемами:
1) ApplicationType не заселенных:
As @ Html.DropDownListFor делает только простой выбор, он заполняет ID, но не заполняет свойство Type, как вы можете видеть ниже (извините, я могу " т разместить изображения, как я здесь новый):
http://i.stack.imgur.com/96IR1.png
На картинке вы можете увидеть, что идентификатор нормально, но тип пуст.
Что я делаю неправильно?
2) Дублирование данных
Вторая проблема заключается в том, что если я заполняю свойство Type вручную во время отладки (имитируя правильный сценарий рабочего процесса), ApplicationType будет дублироваться в базе данных, а не только со ссылкой на старый реестр.
Итак, как я могу сделать @ Html.DropDownListFor ссылаться на предыдущий существующий элемент вместо создания нового?
Благодарим за помощь!
Удивительно! Поэтому моя проблема была не в самом коде, а в том, как работает MVC. Это было легко понять и следовать. –
Кстати, я использовал другой подход: общественного ActionResult Создать (приложение Application) { если (ModelState.IsValid) { INT appTypeID = Convert.ToInt32 (ModelState [ "ApplicationType.Id"] значение.. AttemptedValue); application.ApplicationType = db.ApplicationTypes.Single (s => s.Id == appTypeID); Я был расстроен этим обходным путем ... –