Razor:处理视图中的对象列表和模型验证

时间:2015-01-28 08:18:42

标签: c# asp.net razor

我有两个这样的课程(简单来说)

public class Page
{
    int pageNumber;
    string content;
}

public class Book
{
    public string name;
    public List<Page> pages;
}

现在,在一个剃刀视图中,我有一个表单,允许添加一本书,其中包含表单中的页面列表,以添加页面。

目前,页面是动态添加到表单的,我使用Request.Form在控制器中获取值,以便在控制器中构建Pages列表。问题是,在输入控制器中的操作之前,如何使用页面验证模型(例如页面必须具有非空的内容)。

字段在表单中添加了JQuery。我认为不可能将页面列表直接绑定到视图中的模型,尤其是当使用javascript生成字段时。但也许我错过了一些东西。

由于

3 个答案:

答案 0 :(得分:1)

您可以在将数据发送到服务器之前验证JQuery中的页面。

或者您可以使用过滤器。过滤器是在执行操作之前执行的方法。 (您可能已经看过或使用过[授权]过滤器)

您可以创建验证数据的过滤器,如果验证失败,请求将被重定向到错误页面。

here is a tutorial

here is another tutorial

答案 1 :(得分:1)

您可以在ASP.NET中使用模型绑定,即使您正在添加jquery表单元素,请参阅此内容以创建绑定到模型的集合:

ASP.NET Wire Format for Model Binding to Arrays, Lists, Collections, Dictionaries

我认为您的表单可以像这样完成,以便正确运行模型绑定:

<input type="text" name="name"/>
<input type="text" name="pages[0].pageNumber"/>
<input type="text" name="pages[0].content" />
<input type="text" name="pages[1].pageNumber"/>
<input type="text" name="pages[1].content"/>
<input type="text" name="pages[3].pageNumber"/>
<input type="text" name="pages[3].content"/>

通过该用途,您可以从视图中将Book对象接收到控制器:

public ActionResult Create(Book myBook)
    {}

然后,为了验证,我建议您使用Data Annotation到您的模型,在页面对象的content属性之前使用[Required]标签,或者[MinLenght],请参阅此Microsoft documentation有关数据注释的信息。

[Required]
public string Content { get; set; }

然后在您的视图中,使用jquery.validate(不要忘记在视图中启用它),在控制器中,当您收到模型时,可以使用

检查模型状态
public ActionResult Create(YourObject object)
{
    if (ModelState.IsValid)
    {
            // code when model is valid
    }
}

答案 2 :(得分:0)

使用MVC,您可以在模型属性上使用DataAnnotations。

使用using System.ComponentModel.DataAnnotations;

public class Book{

    [Required]
    public string Name{ get; set; }

    public List<Page> Pages { get; set; }
}

public class Page{

    [Required]
    public int PageNumber{ get; set; }

    [Required]
    public string Content { get; set; }
}

如需更深入的了解,请阅读:http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/adding-validation-to-the-model