我使用ViewModel卡住了。假設我想給一個登錄人員一個編輯表單,其中只有一些來自我的Person域模型的字段(也許我想在ViewModel中自定義註釋驗證)。MVC中ViewModel只使用模型中的幾個屬性
我被困在控制器的兩個獨立的地方(我標記爲「< < < < >>>」)。
當我將整個Person對象作爲屬性傳遞給ViewModel時,我知道該怎麼做。我可以讓我的代碼只更新名稱字段,但後來我失去了驗證ViewModel中各個屬性的能力。如果我將ViewModel中的屬性限制爲只有幾個屬性,那麼我在GET部分中的代碼無法使用vm.Person,因爲我沒有傳遞Person。
我掃描了很多關於SO的例子,但他們都使用了AutoMapper。我可以在沒有映射器的情況下完成這個任務嗎?和/或我該如何編寫我自己的?並提前致謝!
Model:
public class Person()
{
public int PersonId { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string Email { get; set; }
}
ViewModel:
public class LoggedInPersonViewModel()
{
public int PersonId { get; set; }
[Required(ErrorMessage = "Last Name is required")]
public string LastName { get; set; }
public string FirstName { get; set; }
}
Repository:
public Person GetLoggedInPerson()
{
var user = HttpContext.Current.User.Identity;
var userid = user.GetUserId();
return db.People.SingleOrDefault(i => i.UserId == userid);
}
Controller:
public class RegistrationController : Controller
{
//Get Logged in User, Edit Form
public ActionResult UpdateDetails()
{
LoggedInPersonViewModel vm = new LoggedInPersonViewModel();
<<<Do I also need a Person property in my ViewModel>>>
vm.Person = repository.GetLoggedInPerson();
return View(vm);
}
//POST
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateDetails(LoggedInPersonViewModel loggedinpersonviewmodel)
{
if (ModelState.IsValid)
{
<<<what do i do here? is this correct? Again I cannot use Person if not in my VM.>>>
//Person person = db.People.Find(loggedinpersonviewmodel.PersonId);
//Person.FirstName = loggedinpersonviewmodel.FirstName;
//Person.LastName = loggedinpersonviewmodel.LastName;
//db.Entry(person).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index", "Person");
}
return View(loggedinpersonviewmodel);
}
}
}
有沒有辦法......或者我必須使用AutoMapper來做這件事嗎?
謝謝,我會試試看。上次我使用AutoMapper的時候,我的整個項目都變得很時髦。我正在使用DBFirst的第一種方法。如果我的課程在EDMX中,Automapper仍然可以工作嗎? – SKale
是的。 EDMX產生POCO類,Automapper可以正常工作。 –