asp.net mvc ViewState实现

时间:2016-02-02 19:20:36

标签: asp.net asp.net-mvc

我正在开发一个Web项目,我首先从数据库中获取数据并绑定到Html控件。如果存在验证错误,我将发回相同的视图以进行渲染,并显示验证错误。当页面出现时,有一个例外。我逐步完成了代码,发现传递的模型将为null集合。基本上任何未绑定到文本框的属性都更改为null。我被告知不要使用session或viewdata来保存临时存储空间。所以我调用一个方法SaveViewState,它将ViewModel属性的所有属性值保存到静态变量,如此

private static MyViewModel _viewModel;

private MyViewModel SaveViewModel(MyViewModel viewModel)
        {
            if (_viewModel == null)
            {
                _viewModel = new MyViewModel ();
            }

            if (!string.IsNullOrEmpty(viewModel.MyName))
                _viewModel.MyName= viewModel.MyName;
            if (!string.IsNullOrEmpty(viewModel.Number))
                _viewModel.Number= viewModel.Number;
            if (!string.IsNullOrEmpty(viewModel.Address))
                _viewModel.Address= viewModel.Address;
            if (!string.IsNullOrEmpty(viewModel.State))
                _viewModel.State= viewModel.State;
            }

它有效,但我认为这是非常低效的,必须有更好的方法在MVC中使用Session或ViewData或HiddenFields实现ViewState?顺便说一下,我被告知不要使用这三个。

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

我不确定此解决方案是否比使用会话或隐藏字段更糟糕。在您的操作中,您应该使用发布的相同模型返回相应的视图。 ActionResult应该是这样的:

public ActionResult SomePost(SomeModel model)
{
    if (!ModelState.IsValid())
    {
         //error in validation
         return View(model);
    }

     //post save redirect and stuff
     return ... redirect? 
}

ModelState.IsValid()将根据DataAnnotations进行测试。可以使用[Required][MaxLength]等标准属性。

在此配置中,不需要使用SaveViewModel功能。如果您的收藏在发布后为null:重新查询,发布或从类似ViewData的ViewData中获取。

有充分的理由不使用你提到的那三个,但如果你知道这个原因你可能想要考虑它:

1)使用会话:会使可扩展性变得困难,因为会话中的每个请求都必须访问该特定服务器。

2)隐藏字段:不是真正的问题IFF你意识到隐藏字段可以在浏览器中操作。所以不要在那里存储ID

3)ViewData:基本打破了MVC模式;您可以使用它来存储数据,但这是模型的用途。从过滤器中使用ViewData是完全合法的。例如,提供一些通用功能。