如何在asp.net mvc中验证视图中的项目列表

时间:2014-01-02 11:37:13

标签: asp.net-mvc asp.net-mvc-4 razor

我上传了一个包含歌曲的文件。我显示了每首歌曲的属性。如果我上传了一首包含3首歌曲的文件。视图显示如下。

 music id:....                 music id:....                   music id:....
 song Name  :....              song Name  :....                 song Name  :....
 Music director :...           Music director :...             Music director :...

我有这样的观点

@model List<MusicBusinessLayer.Music>
 @using (Html.BeginForm("Create", "Home", FormMethod.Post, new { }))
 {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Music</legend>


 @for (int i = 0; i < Model.Count();i++ )
    {

    <div style="float:left;">
     <div class="editor-label">
    @Html.LabelFor(model => Model[i].Music_Id)
  </div>
  <div class="editor-field">
    @Html.EditorFor(model => Model[i].Music_Id)
   @Html.ValidationMessageFor(model => Model[i].Music_Id)
   </div>

    <pre><div class="editor-label">
    @Html.LabelFor(model => Model[i].Song_Name)
      </div>
     <div class="editor-field">
       @Html.EditorFor(model => Model[i].Song_Name)
     @Html.ValidationMessageFor(model => Model[i].Song_Name)
     </div>

        <div class="editor-label">
     @Html.LabelFor(model => Model[i].Music_Director)
     </div>
      <div class="editor-field">
      @Html.EditorFor(model => Model[i].Music_Director)
      @Html.ValidationMessageFor(model => Model[i].Music_Director)
       </div>
  }
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>

}

我使用像这样的控制器

 public ActionResult Create(List<Music> musicfiles)
    {
       //......
    }

如何验证view.i.e中生成的控件;是否给出了所有字段?

2 个答案:

答案 0 :(得分:2)

数据注释无法跨集合运行。相反,您需要在操作中手动验证。

检查这个问题可能有用 MVC 3 Unobtrusive validation of a list

答案 1 :(得分:1)

您可以将DataAnnotations验证属性添加到Music类的属性中,如:

public class Music
{
    [Required]
    public int Music_Id {get; set;}

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

    public string Music_Director { get; set; }
}

然后根据OP中的一个给出以下视图(我刚删除了一些未关闭的标签):

@model List<MusicBusinessLayer.Music>

@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Music</legend>
        @for (int i = 0; i < Model.Count();i++ )
        {
            <div class="editor-label">
                @Html.LabelFor(model => Model[i].Music_Id)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => Model[i].Music_Id)
                @Html.ValidationMessageFor(model => Model[i].Music_Id)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => Model[i].Song_Name)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => Model[i].Song_Name)
                @Html.ValidationMessageFor(model => Model[i].Song_Name)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => Model[i].Music_Director)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => Model[i].Music_Director)
                @Html.ValidationMessageFor(model => Model[i].Music_Director)
           </div>
        }
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

以下虚拟控制器方法:

public ActionResult Create()
{
    List<Music> musicFiles = new List<Music>()
    {
        new Music { Music_Id = 123, Song_Name = "foo1" }, 
        new Music { Music_Id = 456, Song_Name = "foo2" }
    };
    return View(musicFiles);
}

[HttpPost]
public ActionResult Create(List<Music> musicFiles)
{
    if (ModelState.IsValid)
        return RedirectToAction("Index");

    return View(musicFiles);
}

ModelState.IsValidCreate列表中的任何项目Music_Id被发布为空时,您应该在POST Song_Name控制器方法中看到musicFiles为false值。