2014-01-15 61 views
4

我使用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來做這件事嗎?

回答

4

我想你需要映射LoggedInPersonViewModelPerson。示例

public ActionResult UpdateDetails() 
{ 
    var person = repository.GetLoggedInPerson(); 
    LoggedInPersonViewModel vm = new LoggedInPersonViewModel(); 

    vm.PersonId = person.PersonId; 
    //Rest of properties 
    ... 

    //return view model 
    return View(vm); 
} 

我會推薦AutoMapper這種類型的工作。即AutoMapper是一個簡單的小型庫,用於解決看似複雜的問題 - 擺脫將一個對象映射到另一個對象的代碼。

+0

謝謝,我會試試看。上次我使用AutoMapper的時候,我的整個項目都變得很時髦。我正在使用DBFirst的第一種方法。如果我的課程在EDMX中,Automapper仍然可以工作嗎? – SKale

+0

是的。 EDMX產生POCO類,Automapper可以正常工作。 –