web-dev-qa-db-ja.com

フォームが送信されたときにモデルがnullです

送信を押すと、fileパラメータが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; }
}

ここに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>
20
Shimmy

それは名前の競合であり、バインダーはFileプロパティをFileViewModelオブジェクトにファイル名でバインドしようとするため、nullが返されます。 POST名前は大文字と小文字を区別しません。

変化する:

public ActionResult Create(FileViewModel file)

に:

public ActionResult Create(FileViewModel model)

または他の名前に

53
webdeveloper

これで私の問題も解決しました。それは私が使用していた名前で、モデルに似ていました。これは、投稿したモデルに割り当てた変数にも似ていました。フィールド名を並べ替えると、すべて期待どおりに機能しました。

もちろん、エラーはこれを指摘するのに役立ちませんでした。

1
ransems