2013-02-25 3 views
0

Прежде всего, извините за то, что вы недавно собрались, тема, которая была покрыта много раз прежде, чем на этом сайте. Насколько я стараюсь, я просто не могу получить мой код работать.ASP.net MVC3 Выберите иностранный ключ в. С помощью DropDownList

я следующие классы моделей:

public class ProjectsTable { 
    public int ID {get; set;} 
    public String ProjectName {get; set;} 
    ... 
    public virtual Manager Manager_Id {get; set;} // Stores foreign key of Manager 
} 

public class Manager { 
    public int ID {get; set;} 
    public String ManagerName {get; set;} 
    ... 
    public virtual ICollection<ProjectsTable> Projects {get; set;} 
} 

Класс ProjectsTable Контроллер содержит следующий способ удвоить как отображения и редактирования страницы:

private SynthContext db = new SynthContext(); 
... 

// GET: /ProjectsTable/Parameters/5 
public ActionResult Parameters(int id) { 
    ProjectsTable projectstable = db.ProjectsTable.Find(id); 
    ViewBag.Manager_Id = new SelectList(db.Manager, "ID", "ManagerName"); 
    return View(projectstable); 
} 

// POST: /ProjectsTable/Parameters/5 
public ActionResult Parameters(ProjectsTable projectstable) { 
    if(ModelState.IsValid) { 
    db.Entry(projectstable).State = EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Parameters"); 
    } 
    ViewBag.Manager_Id = new SelectList(db.Manager, "ID", "ManagerName"); 
    return View(projectstable); 
} 

Наконец, Parameters.cshtml содержит следующие код для отображения выпадающего меню

@model Synth.Models.ProjectsTable 
... 
<fieldset> 
... 
    <div class="editor-lable"> 
    @Html.LabelFor(model => model.Manager_ID) 
    </div> 
    <div class="editor-field"> 
    @HTML.DropDownList("Manager_ID", String.Empty) 
    </div> 
    <input type="submit" value="Update"> 
</fieldset> 

Когда я тестирую e, я могу перейти к /ProjectsTable/Parameters/x без проблем; выпадающее меню будет правильно сгенерировано, содержащее список имен менеджеров. Однако, когда я нажимаю кнопку «Обновить», идентификатор Manager_ID выделяется красным цветом, что указывает на то, что изменение не регистрируется. Я могу подтвердить, что изменения не были зарегистрированы путем перехода на /ProjectsTable/list, где я не вижу никаких изменений, которые вступили в силу.

Я попытался добавить @Html.ValidationMessageFor(Model.Manager_ID), результат в любом случае «Значение« x »недействительно», где x - допустимое значение ID (я проверил его по базе данных).

Я просмотрел сгенерированный источник HTML и не вижу ничего плохого там.

У меня есть подозрение, что мне нужно заменить @HTML.DropDownList на @HTML.DropDownListFor, но я не могу понять, какие параметры ему нужны, чтобы заставить его работать. EDIT - Мне удалось получить DropDownListFor, но проблема не устранена. Связанный с этим вопрос, помогающий мне решить эту проблему, может состоять в том, как просматривать сообщения, отправленные обратно на сервер.

Любая помощь будет высоко оценена.

Поблагодарив всех вас заранее ...

Чопо

ответ

0

Итак, я, наконец, нашел проблему. Это не имело никакого отношения к виду или контроллеру. По-видимому, я не правильно написал модель: внешний ключ должен храниться как int?, а также указатель на рассматриваемую модель.

public class ProjectsTable { 
    public int ID {get; set;} 
    public String ProjectName {get; set;} 
    ... 

    public int? ManagerID {get; set;} // Stores foreign key of Manager 
    public virtual Manager Manager // I have no idea if this line does anything 
} 

public class Manager { 
    public int ID {get; set;} 
    public String ManagerName {get; set;} 
    ... 
    public virtual ICollection<ProjectsTable> Projects {get; set;} 
} 

Пока не необходимо, Вид также выгоды от использования функции:

Html.DropDownListFor(model => model.Manager_ID, ViewBag.Manager_Id as SelectList, String.Empty) 

Функция @HTML.DropDownList("ManagerID", String.Empty) также работает, но для того, чтобы сделать это имя объекта ViewBag передается от контроллер (ManagerID) должен точно соответствовать внешнему ключу модели. Это замысловато и запутанно для меня. Я предпочитаю строго типизированный подход.

Для полноты я включил полностью исправленный код:

Контроллер:

private SynthContext db = new SynthContext(); 
... 

// GET: /ProjectsTable/Parameters/5 
public ActionResult Parameters(int id) { 
    ProjectsTable projectstable = db.ProjectsTable.Find(id); 
    // The following line has been amended, but this change is not strictly necessary 
    ViewBag.m_id = new SelectList(db.Manager, "ID", "ManagerName", projectstable.ManagerID); 
    return View(projectstable); 
} 

// POST: /ProjectsTable/Parameters/5 
public ActionResult Parameters(ProjectsTable projectstable) { 
    if(ModelState.IsValid) { 
    db.Entry(projectstable).State = EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Parameters"); 
    } 
    ViewBag.m_id = new SelectList(db.Manager, "ID", "ManagerName", projectstable.ManagerID); 
    return View(projectstable); 
} 

Вид:

@model Synth.Models.ProjectsTable 
... 
<fieldset> 
... 
    <div class="editor-lable"> 
    @Html.LabelFor(model => model.ManagerID) 
    </div> 
    <div class="editor-field"> 
    Html.DropDownListFor(model => model.ManagerID, ViewBag.m_id as SelectList, String.Empty) 
    @Html.ValidationMessageFor(model => model.ManagerID) 
    </div> 
    <input type="submit" value="Update"> 
</fieldset> 
0

Я думаю, что вы путаете себя, потому что у вас есть модель свойство Manager_Id и объект viewBag Manager_Id. Ошибка modelState относится к свойству model, а не к любым значениям в раскрывающемся списке, которые привязаны к объекту viewBag. Я предлагаю вновь именовании ViewBag, чтобы избежать путаницы (или, еще лучше, не используя ViewBag вообще), и добавив скрытое поле для модели объекта:

@Html.HiddenFor(m => m.Manager_Id) 

В качестве примечания, из ваших описаний вашего устранение неполадок выше, я также предлагаю упростить отладку в визуальной студии, установить контрольные точки и проверить значения. Это сделает вашу жизнь намного проще в долгосрочной перспективе.

+0

Интересно, что когда-то я переименовать viewbag в 'm_id' и изменить cshtml код в '@ HTML.DropDownList (" m_ID ", String.Empty)' Я больше не получаю никакой ошибки проверки, но теперь мой контроллер просто не регистрирует и не сохраняет то, что я выбираю в 'DropDownList'. Могу ли я использовать 'DropDownList', или мне нужно переключиться на' DropDownListFor', и если да, какие параметры мне нужно ввести. – Chopo87

+0

Документация для DropDownListFor это [здесь] (http://msdn.microsoft.com/en-us/library/system.web.mvc.html.selectextensions.dropdownlistfor (v = vs.108) .aspx). –

+0

Значения ddl не находятся в вашем контроллере, потому что объект viewBag не является частью модели, которую вы передаете. –

Смежные вопросы