繁体   English   中英

asp.net mvc ViewState 实现

[英]asp.net mvc ViewState implementation

我在一个 web 项目上工作,我首先从数据库中获取数据并绑定到 Html 控件。 如果存在验证错误,我将发送回相同的视图以进行渲染,并显示验证错误。 当页面出现时,出现异常。 我逐步查看代码,发现 model 已通过 will null 集合。 基本上任何未绑定到文本框的属性都更改为 null。我被告知不要使用 session 或 viewdata 来保持临时存储。 所以我调用了一个方法 SaveViewState ,它将 ViewModel 属性的所有属性值保存到一个 static 变量中,就像这样

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? 顺便说一下,我被告知不要使用这三个。

任何帮助表示赞赏。 谢谢。

我不确定此解决方案是否比使用 session 或隐藏字段更糟糕。 在您的操作中,您应该返回与发布的相同 model 的相应视图。 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 function。 如果您的收藏在发布后是null :重新查询它,发布它或从 ViewData 中获取它,例如 object。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM