asp.net mvc 视图状态实现

本文关键字:实现 视图状态 mvc net asp | 更新日期: 2023-09-27 18:32:53

我正在处理一个 Web 项目,我首先从数据库中获取数据并绑定到 Html 控件。如果存在验证错误,我将发送相同的视图以显示验证错误进行渲染。当页面出现时,有一个例外。我逐步浏览了代码,发现模型已传递将空集合。基本上,任何未绑定到文本框的属性都更改为 null。我被告知不要使用会话或视图数据来保持临时存储。所以我调用了一个方法 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 中使用会话或视图数据或隐藏字段实现 ViewState?顺便说一句,我被告知不要使用这三个。

任何帮助,不胜感激。谢谢。

asp.net mvc 视图状态实现

我不确定此解决方案是否比使用会话或隐藏字段更糟糕。在您的操作中,您应该返回具有已发布相同模型的相应视图。操作结果应如下所示:

public ActionResult SomePost(SomeModel model)
{
    if (!ModelState.IsValid())
    {
         //error in validation
         return View(model);
    }
     //post save redirect and stuff
     return ... redirect? 
}

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

在此配置中,不需要使用 SaveViewModel 函数。如果您的集合在发布后null:重新查询它、发布它或从类似 ViewData 的对象中获取它。

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

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

2(隐藏字段:这不是真正的问题,如果您意识到隐藏字段可以在浏览器中进行操作。所以不要在那里存储身份证

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