如何在MVC中使用单独的模型类进行验证

时间:2012-07-13 08:03:11

标签: c# asp.net-mvc

我不知道如何实现这一点,我在Controllers文件夹中有一个MovieController.cs,在Models文件夹中有一个MovieCreateViewModel.cs。我需要为创建,编辑和删除视图添加验证。

MovieDetailsViewModel.cs

public class MovieDetailsViewModel
{
    public int Id { get; set; }
 }     

然后我有MovieController.cs

public class MovieController : Controller
{

    Connect connection;
    MovieCreateViewModel movie;
    MovieDetailsViewModel id;

    public MovieController()
    {
        this.connection = new Connect();
        this.movie = new MovieCreateViewModel();
        this.id = new MovieDetailsViewMode();
    } 

    public ActionResult Edit(MovieDetailsViewModel id)
    {
        movie = this.connection.MovieContext.Where(m => m.ID == id).SingleOrDefault();  **//I get an error here**
        return View(movie);
    }

    //
    // POST: /Movie/Edit/5

    [HttpPost]
    public ActionResult Edit(MovieCreateViewModel movieedit)
    {
        try
        {
            if (ModelState.IsValid)
            {
                this.connection.MovieContext.AddObject(movieedit);
                this.connection.MovieContext.Context.SaveChanges();
                return RedirectToAction("Index");
            }

        }
        catch
        {
            return View(movieedit);
        }
    }

对于httpPost,我在参数列表中创建了类型MovieDetailsViewModel id 请问我从哪里开始?

由于

2 个答案:

答案 0 :(得分:1)

现在将对您的模型实例执行验证,以进行检查,您执行以下操作:

ModelState.IsValid

在保存操作之前的控制器方法中。只要视图上的输入名称与模型类的属性名称相对应,就会在执行操作方法之前隐式执行绑定和验证。要在视图中显示验证消息,请在视图顶部添加Html.ValidationMessage()。希望这可以帮助。顺便说一下,它值得一试Foolproof Validation,它提供条件验证属性和其他一些好东西。

答案 1 :(得分:0)

更好的练习将使用单独的模型和视图模型。将模型转换为viewmodel,然后将其传递给view

public ActionResult Edit(int id)
{
     var movie = this.connection.MovieContext.SingleOrDefault(m => m.ID == id);
     var vm = new MovieCreateViewModel{ Id = movie.Id};
     return View(vm);
}

//
// POST: /Movie/Edit/5

[HttpPost]
public ActionResult Edit(MovieCreateViewModel vm)
{
    try
    {
        if (ModelState.IsValid)
        {
            var movie = new Movie{Id = vm.Id};
            this.connection.MovieContext.Attach(movie);
            this.connection.MovieContext.Context.SaveChanges();
            return RedirectToAction("Index");
        }

    }
    catch
    {
        return View(movieedit);
    }
}