送信を押すと、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>
それは名前の競合であり、バインダーはFileプロパティをFileViewModelオブジェクトにファイル名でバインドしようとするため、nullが返されます。 POST名前は大文字と小文字を区別しません。
変化する:
public ActionResult Create(FileViewModel file)
に:
public ActionResult Create(FileViewModel model)
または他の名前に
これで私の問題も解決しました。それは私が使用していた名前で、モデルに似ていました。これは、投稿したモデルに割り当てた変数にも似ていました。フィールド名を並べ替えると、すべて期待どおりに機能しました。
もちろん、エラーはこれを指摘するのに役立ちませんでした。