表单提交时模型为空 [英] Model is null when form submitted

查看:34
本文介绍了表单提交时模型为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我点击提交时,file 参数为空.

public ActionResult Create(){返回视图(新文件视图模型());}[HttpPost][初始化BlobHelper]公共 ActionResult 创建(FileViewModel 文件){如果(模型状态.IsValid){//上传文件}别的返回视图(文件);}公共类 FileViewModel{内部常量字符串 UploadingUserNameKey = "UserName";内部常量字符串 FileNameKey = "FileName";内部常量字符串文件夹 =文件";私有只读 Guid guid = Guid.NewGuid();公共字符串文件名{得到{如果(文件==空)返回空;var 文件夹 = 文件夹;return string.Format("{0}/{1}{2}", folder, guid, Path.GetExtension(File.FileName)).ToLowerInvariant();}}[必填值]公共 HttpPostedFileBase 文件 { 获取;放;}}

这是cshtml:

@model MyProject.Controllers.Admin.FileViewModel@{ViewBag.Title = "创建";Layout = "~/Views/Shared/_BackOfficeLayout.cshtml";}@using (Html.BeginForm("Create", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })){<字段集><legend>创建</legend><div class="editor-label">@Html.LabelFor(model => model.File)

<div class="editor-field">@Html.TextBoxFor(model => model.File, new { type = "file" })@Html.ValidationMessageFor(model =>model.File)

<p><输入类型=提交"值=创建"/></p></fieldset>}<div>@Html.ActionLink("返回列表", "索引")

解决方案

它的命名冲突和绑定器试图将您的 File 属性绑定到具有文件名的 FileViewModel 对象,这就是为什么您得到 null.POST 名称不区分大小写.

变化:

public ActionResult 创建(FileViewModel 文件)

致:

public ActionResult 创建(FileViewModel 模型)

或任何其他名称

When I hit submit, the file parameter is null.

public ActionResult Create()
{
  return View(new FileViewModel());
}

[HttpPost]    
[InitializeBlobHelper]
public ActionResult Create(FileViewModel file)
{
  if (ModelState.IsValid)
  {
     //upload file
  }
  else
    return View(file);
}

public class FileViewModel
{
  internal const string UploadingUserNameKey = "UserName";
  internal const string FileNameKey = "FileName";

  internal const string Folder = "files";

  private readonly Guid guid = Guid.NewGuid();

  public string FileName
  {
    get
    {
      if (File == null)
        return null;
      var folder = Folder;
      return string.Format("{0}/{1}{2}", folder, guid, Path.GetExtension(File.FileName)).ToLowerInvariant();
    }
  }

  [RequiredValue]
  public HttpPostedFileBase File { get; set; }
}

Here is the cshtml:

@model MyProject.Controllers.Admin.FileViewModel

@{
  ViewBag.Title = "Create";
  Layout = "~/Views/Shared/_BackOfficeLayout.cshtml";
}

@using (Html.BeginForm("Create", "Files", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <fieldset>
    <legend>Create</legend>

    <div class="editor-label">
      @Html.LabelFor(model => model.File)
    </div>
    <div class="editor-field">
      @Html.TextBoxFor(model => model.File, new { type = "file" })
      @Html.ValidationMessageFor(model => model.File)
    </div>

    <p>
      <input type="submit" value="Create" />
    </p>
  </fieldset>
}

<div>
  @Html.ActionLink("Back to List", "Index")
</div>

解决方案

It's naming conflict and binder trying to bind your File property to FileViewModel object with file name, that's why you get null. POST names are case-insensitive.

Change:

public ActionResult Create(FileViewModel file)

To:

public ActionResult Create(FileViewModel model)

or to any other name

这篇关于表单提交时模型为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆