简体   繁体   中英

asp.net mvc ViewState implementation

I working on a web project where I first get data from the database and bind to the Html control. If there is a validation error I will send the same view back for rendering with the displayed validation errors. When the page comes up, there is an exception. I stepped through the code and found that the model was passed will null collection. Basically any property that was not binded to a textbox was changed to null. I was told not to use session or viewdata to keep temp storage. So I call a method SaveViewState where it save all the property value of the ViewModel property to a static variable like so

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;
            }

It works but I think it is very inefficient and there must be a better way to implement ViewState in MVC with Session or ViewData or HiddenFields? By the way, I was told not to use those three.

Any help is appreciated. Thanks.

I am not sure if this solution is worse than using a session or hidden fields. In your action you should return the corresponding view with the same model that was posted. The ActionResult should be something like this:

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

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

The ModelState.IsValid() will test according to the DataAnnotations. Standard attributes like [Required] , [MaxLength] etc. are available.

In this configuration, the use of a SaveViewModel function is not required. If your collection is null after post: re-query it, post it or fetch it from a ViewData like object.

There are good reasons not to use those three you mentioned, but if you know that reason you might want to consider it:

1) Use of session: will make scalability difficult because every request in a session must hit that specific server.

2) Hidden fields: Not really a problem IFF you realize the hidden field can be manipulated in a browser. So don't store ID's there

3) ViewData: basically breaks the MVC pattern; you can use it to store data but that's what a model is for. It totally legitimate to use ViewData from a filter. To provide some general functionality for example.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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