2015-03-31 70 views
0

在我的asp.NET MVC5应用程序中,我有一个控制器,它提供了与视图模型强类型的视图。此视图模型具有SelectList属性(等等),并且所述控制器从所述数据库提供上创建数据:在MVC5中验证时将数据保存在ViewModel中

public ActionResult Simulation() { 
    var SimVM = new SimulationVM(
     StrategyRepository.GetStrategies().Select(n => n.Name), 
    ); 
    return View(SimVM); 
} 

SelectList将随后用作DropDown选择的形式的数据源。该HttpPost方法做了一些资料验证,即,因此与上面的代码

[HttpPost] 
public ActionResult Simulation(SimulationVM _simVM) { 
    if (ModelState.IsValid) { 
     // ... 
    }   
    else return View(_simVM); 
} 

,所述DropDown数据是空的,因为上发帖,在SimulationVM对象被创建新。使用Html.HiddenFor的常用技巧对集合无效。

当然,我可以从数据库中重新获取数据,但这似乎很糟糕,数据库获取这样一个简单的东西,就像我知道数据没有改变的验证一样。

什么是最好的(或为了不主观:任何)的方式来保留ViewModel中的一些数据(或有效地重新填充)?

+1

您应该返回并从数据库中再次获取'SelectList'的数据。你为什么认为这很糟糕? – 2015-03-31 11:07:38

+2

如果您觉得性能是一个问题,您可以缓存选择列表:[stackoverflow.com/questions/18703958/persist-selectlist-in-model-on-post](http://stackoverflow.com/questions/18703958/persist -selectlist-in-model-on-post) – markpsmith 2015-03-31 11:24:05

+0

@Stephen Muecke:我总是有这样的印象,出于性能考虑,应尽量减少数据库抓取。这似乎是不必要的,因为数据在验证之间不应该改变。 – EluciusFTW 2015-03-31 11:30:02

回答

1

如果这是一个要求你不回到数据库并且你100%确信数据不会改变(即这是一个状态列表而不是订单列表或其他),那么你可以将集合添加到会话变量。这里有一个链接到一个像样的文章:

https://code.msdn.microsoft.com/How-to-create-and-access-447ada98

话虽这么说,我通常只是去到数据库并再次获取数据。如果再次这样做会造成巨大的性能问题,那么很可能是第一次造成性能问题,应该对症下药,而不是症状。