首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有自定义验证的MVC文件上传为空

带有自定义验证的MVC文件上传为空
EN

Stack Overflow用户
提问于 2013-06-03 12:46:51
回答 3查看 1.8K关注 0票数 0

我上传和图片,并验证它的有效性在这里:然而,我的例子略有不同,因为我不仅收到文件,我也收到了一些属性为我的模型。但是,我的验证程序总是触发,我调试并发现我的文件总是空的,所以验证器总是返回'false‘。我不明白为什么,我的意见似乎是正确的。有什么想法吗?

代码语言:javascript
复制
namespace PhotoManagement.Models
{
public class Photo
{
    public virtual int PhotoId { get; set; }
    public virtual int ClientId { get; set; }
    public virtual string PhotoDescription { get; set; }
    [ImageValidation(ErrorMessage="Please select a PNG/JPEG image smaller than 10 MB")]
    [NotMapped]
    public HttpPostedFileBase File { get; set; }
}
}

代码语言:javascript
复制
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Photo photo)
    {
        if (ModelState.IsValid)
        {
            db.Photos.Add(photo);
            db.SaveChanges();
            // File upload occurs now
            var FilePath = Path.Combine(Server.MapPath("~/App_Data/" + photo.ClientId), photo.PhotoId.ToString());
            photo.File.SaveAs(FilePath);
            return RedirectToAction("Create");
        }
        else return View();
    }

代码语言:javascript
复制
@using (Html.BeginForm(new { enctype = "multipart/form-data" })) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>Photo for @Session["Name"]</legend>

    <div class="editor-field">
        @Html.Hidden("ClientId",(int)Session["UserId"])
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.PhotoDescription)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.PhotoDescription)
        @Html.ValidationMessageFor(model => model.PhotoDescription)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.File)
    </div>
    <div class="editor-field">
        <input type="file" name="File" id="File"/>
        @Html.ValidationMessageFor(model => model.File)
    </div>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-03 13:02:17

您正在使用错误的Html.BeginForm助手重载

正确的呼吁是:

代码语言:javascript
复制
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{

}

你在打电话:

代码语言:javascript
复制
Html.BeginForm(object routeValues)

而不是:

代码语言:javascript
复制
Html.BeginForm(
    string actionName, 
    string controllerName, 
    FormMethod method, 
    object htmlAttributes
)

看看浏览器中生成的标记,您就会看到根本的区别。

票数 1
EN

Stack Overflow用户

发布于 2013-06-03 12:56:19

而不是

代码语言:javascript
复制
public ActionResult Create(Photo photo)

试一试

代码语言:javascript
复制
public ActionResult Create(Photo photo, HttpPostedFileBase file)

编辑:不要忘记将HTTP设置为在视图中发布:

代码语言:javascript
复制
@using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post, new { enctype = "multipart/form-data" }))
票数 0
EN

Stack Overflow用户

发布于 2013-06-03 13:03:45

Model中的文件总是会给出null。为了获得文件:

代码语言:javascript
复制
[HttpPost]
        public ActionResult Create(UserViewModel model, 
FormCollection formCollection, HttpPostedFileBase file){

     /* Your code here */
    if(file==null)
    {
        ModelState.AddModelError("NoFile", "Upload File");
    }
}

在这里,HttpPostedFileBase文件将为您提供上传文件的完整对象。可以对对象文件进行检查。不要忘记在视图中添加下面提到的验证消息。

代码语言:javascript
复制
@Html.ValidationMessage("NoFile")
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16897077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档