我在表格验证方面遇到了一些困难。
由于我想从数据库填充组合框(另一个表,我使用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" />
答案 0 :(得分:0)
通常,您有3个不同的部分,这些部分构建了您的场景的正确实现。
在正确的实现中,您为每个视图获得了自己的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
}
}
}
我希望我完全理解你的问题,这有助于解决问题。