ASP.NET MVC验证模型

时间:2015-02-03 07:53:02

标签: c# asp.net-mvc validation

我在表格验证方面遇到了一些困难。

由于我想从数据库填充组合框(另一个表,我使用viewbags来做这个),在这种情况下有没有办法使用ComboBoxFor所以我可以使用System.ComponentModel.DataAnnotations和jquery.validate的.js?

查看:

@model MyProject.OpenAccess.Document
@using (Html.BeginForm("CreateDocument", "Create", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <label>Select file:</label><br />
  <input type="file" name="file" /><br />
  <label>Filetype</label><br />
  @Html.DropDownList("fileType", (IEnumerable<SelectListItem>)ViewBag.ListFiletypes, "-Filetypes", new { @class = "filetype-cb" }) <br />
  <input type="submit" value="Add"/>
}

控制器:

public ActionResult CreateDocument(HttpPostedFileBase file, string fileType)
{
  if (file != null && file.ContentLength > 0)
  {
    Document doc = new Document()
    {
      Filetype = fileType
    }
    if (this.TryValidateModel(doc))
    {
      this.dbContext.Add(doc);
      this.dbContext.SaveChanges();
      id = doc.ID;
      //save document using document ID
    }
  }
}

修改

以下是我目前的实现:

Layout.cshtml

请记住添加:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

查看

@model MyProject.OpenAccess.Document
@using (Html.BeginForm("CreateDocument", "Create", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <label>Select file:</label><br />
    <input type="file" data-val="true" data-val-required="Please select a file!" name="file" /><br />
    <label>Filetype</label><br />
    @Html.DropDownListFor(m => m.FileType, (IEnumerable<SelectListItem>)ViewBag.ListFiletypes, "", new { @class = "filetype-cb" })
    <input type="submit" value="Add"/>
}

控制器

[HttpGet]

public ActionResult CreateDocument()
{
    ViewBag.ListFiletypes = new SelectList(this.dbContext.ListFiletypes.ToList(), "FileType", "FileType");
    //Populate dropdownlist from database
}

[HttpPost]

 public ActionResult CreateDocument(HttpPostedFileBase file, Document doc)
 {
    if (file != null && file.ContentLength > 0)
    {
        if (this.TryValidateModel(doc))
        {
            this.dbContext.Add(doc);
            this.dbContext.SaveChanges();
            id = doc.ID;
            //save document using document ID
        }
    }
}

模型

public partial class Document
{
    private int _iD;
    public virtual int ID
    {
        get
        {
            return this._iD;
        }
        set
        {
            this._iD = value;
        }
    }

    private string _fileType;
    [Required(ErrorMessage = "Required!")]
    public virtual string FileType
    {
        get
        {
            return this._fileType;
        }
        set
        {
            this._fileType = value;
        }
    }
}

有充分的理由在Viewbag上使用Viewmodel填充DropDownListFors(从http://www.codeproject.com/Articles/687061/Multiple-Models-in-a-View-in-ASP-NET-MVC-MVC找到)?

这个实现的唯一问题是我无法在客户端验证文件(因此用户无法发布空文件)。

编辑:只需添加以下内容即可实现:

  <input type="file" data-val="true" data-val-required="Please select a file!" name="file" />

1 个答案:

答案 0 :(得分:0)

通常,您有3个不同的部分,这些部分构建了您的场景的正确实现。

ViewModel:

在正确的实现中,您为每个视图获得了自己的Viewmodel。在你的情况下,这将是这样的:

public class CreateDocumentViewModel
{
    [Required]
    public IEnumerable<SelectListItem> filetypes { get; set; }
    // Maybe some more attributes you need in the view?
}

注意:您可以在这里使用所需的数据注释。

视图:

该视图包含下拉列表中的实际数据。

@model CreateDocumentViewModel
@using (Html.BeginForm("CreateDocument", "Create", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
     <label>Select file:</label><br />
     <input type="file" name="file" /><br />
     <label>Filetype</label><br />
     @Html.DropDownListFor(model => model.filetypes, model.filetypes, "-Filetypes", new { @class = "filetype-cb" })
     <br />
     <input type="submit" value="Add"/>
}

控制器:

您需要的控制器有2个动作。 GET-和POST-动作。

[HttpGet]       
public ActionResult CreateDocument()
{
    CreateDocumentViewModel model = new CreateDocumentViewModel();
    model.filetypes = FillFileTypesFromDB; // Here you fill the data for the dropdown!
    return View(model);    
}

最后,您需要保存回数据库的POST操作。

[HttpPost]
public ActionResult CreateDocument(HttpPostedFileBase file, string fileType)
{
  if (file != null && file.ContentLength > 0)
  {
    Document doc = new Document()
    {
      Filetype = fileType
    }
    if (this.TryValidateModel(doc))
    {
      this.dbContext.Add(doc);
      this.dbContext.SaveChanges();
      id = doc.ID;
      //save document using document ID
    }
  }
}

我希望我完全理解你的问题,这有助于解决问题。