2011-03-17 37 views
0

我是ASP.NET MVC的新手,我遇到以下问题。ViewModel在服务器端验证中丢失的一部分

让我们先从一些代码:

视图模型:

public class StatesEditViewModel 
{ 
    [Required] 
    public virtual int StateId { get; set; } 
    [Required] 
    public virtual string Name { get; set; } 

    public virtual int CountryId { get; set; } 
    public List<Country> Countries { get; set; } 
} 

控制器:

public ActionResult Edit(int id) 
{ 
    using (DataEntities context = new DataEntities()) 
    { 
     UnitOfWork uow = new UnitOfWork(context); 

     State s = uow.States.GetById(id); 

     StatesEditViewModel vm = new StatesEditViewModel(); 
     vm.StateId = s.StateId; 
     vm.Name = s.Name; 
     vm.CountryId = s.CountryId; 

     vm.Countries = = uow.Country.GetAll().ToList<Country>(); 

     return View(vm); 
    } 
} 


[HttpPost] 
public ActionResult Edit(int id, StatesEditViewModel vm) 
{ 
    if (ModelState.IsValid) 
    { 
     using (DataEntities context = new DataEntities()) 
     { 
      UnitOfWork uow = new UnitOfWork(context); 

      State s = uow.States.GetById(id); 
      p.Name = vm.Name; 
      p.CountryId = vm.CountryId; 

      uow.Commit(); 

      return RedirectToAction("Index"); 
     } 
    } 
    else 
    { 
     //vm.Countries <-- This is NULL 
     return View(vm); 
    } 
} 

问题上课即vm.Countries为空。是否有任何选项/解决方案可以避免重新填充ViewModel的那部分?

以防万一,我使用Telerik的组合框控件在我看来:

@(Html.Telerik().ComboBox() 
     .Name("CountryId") 
     .BindTo(new SelectList(Model.Countries, "CountryId", "Name")) 
     .SelectedIndex(Model.CountryId) 
     .Filterable() 
) 

谢谢!

回答

2

国家收集不是形式的一部分,所以他们从来不张贴到服务器。仅发送选定的ID。因此,如果模型无效,您需要渲染视图,只需从数据存储区重新获取此集合:

[HttpPost] 
public ActionResult Edit(int id, StatesEditViewModel vm) 
{ 
    using (var context = new DataEntities()) 
    { 
     if (ModelState.IsValid) 
     { 
      var uow = new UnitOfWork(context); 
      State s = uow.States.GetById(id); 
      p.Name = vm.Name; 
      p.CountryId = vm.CountryId; 
      uow.Commit(); 
      return RedirectToAction("Index"); 
     } 
     // The model is not valid, we need to 
     // redisplay the same view so that the 
     // user can fix the errors => fetch the countries collection 
     vm.Countries = uow.Country.GetAll().ToList<Country>(); 
     return View(vm); 
    } 
} 
+0

非常感谢! – Leandro 2011-03-17 19:41:36