我目前可以使用以下模型註釋,視圖模型和自定義編輯器模板來填充和顯示下拉菜單 - 但是存在問題持續提交低於更多):使用MVC存儲SelectList ID的問題EditFor模板和註釋(.net 4,mvc3)
//Domain
Public class Person
{
public string FirstName {get;set;}
public string LastName {get;set;}
public string ClassName {get;set;}
public int ClassId {get;set;}
...
}
//ViewModel
Public class PersonViewModel
{
public Person Person {get;set;}
[UIHint("SelectList")]
public IEnumerable<SelectListItems> Classes {get;set;}
public PersonViewModel
{
Person = new Person();
}
}
//Controller
public ActionResult Create()
{
var PersonViewModel = new PersonViewModel();
_PersonService.PopulateClassList(PersonViewModel);
return View("Create", PersonViewModel);
}
[HttpPost]
public ActionResult Create(PersonViewModel PersonViewModel)
{
try
{
if (!ModelState.IsValid)
{
_PersonService.PopulateClassList(PersonViewModel);
return View("Create", PersonViewModel);
}
var Person = new Person();
Person.InjectFrom(PersonViewModel.Person);
_PersonService.Save(Person);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
//View (just the pertinent part)
@Html.EditorFor(m => m.Classes)<br />
@Html.EditorFor(m => m.Person)
自動使用下面的模板 - 由於視圖模型註釋
// Views/Shared/EditorTemplates/SelectList.cshtml
@model IEnumerable<SelectListItem>
@Html.DropDownListFor(m => m, Model)
就像我提到的,以上工作正常 - 因爲在下拉顯示正常,但顯然在目前的狀態下不把classID(或名稱)保存到Person實體,我理解這個問題,但不知道如何解決它。
我的問題:
我怎樣才能從下拉保存選擇的值下降到Person實體
我怎樣才能節省的ID和名稱到Person實體 - 我猜只有一個方法是一個隱藏的字段,它會被一個onchange事件填充(這聽起來很奇怪,我敢肯定,但它存儲在一個文檔數據庫中,所以它沒有被標準化 - 我可能只是將Name存儲在最後)
在此先感謝! 邁克
@GregB感謝您的建議,我不太確定我是否做得正確。也就是說,我有很多下拉菜單和其他邏輯,如果我將它們全部放在控制器上,它會變得笨重,我想避免。這就是爲什麼我認爲在服務層做所有這些都是一個好主意,但是你說這不是什麼?你會建議創建一個'builder'類,我可以實例化並從控制器傳遞一個視圖模型來完成所有這些? – Mikalee 2011-03-25 16:22:41
@GregB同樣,關於您給出的下拉代碼「@ Html.DropDownListFor(x => x.SelectedClassId,Model.Classes,new {id =」classSelect「})」,我想將該值插入Person viewModel中嵌入Person的.ClassId,而不是在viewmodel中創建ClassId,這可能嗎?再次感謝。 – Mikalee 2011-03-25 16:25:58
@Mikalee我不認爲在服務層創建下拉列表是有意義的,因爲下拉列表只在視圖的上下文中才有意義。如果你在服務層實現了一個返回一堆SelectListItems的方法,但是隻想在另一個視圖中列出所有的類,那麼你必須編寫一個全新的方法來實現這一點。更好地保持服務層專注於數據訪問,並擔心控制器中的格式化。如果你真的想把邏輯從控制器中拿出來,你可以把它放在模型中。我會編輯我的答案,告訴你如何。 – GregB 2011-03-25 20:49:08