次のようにバインディングを使用して複数のファイルをアップロードViews
しています。ViewModel
@model IVRControlPanel.Models.UploadNewsModel
@using (Html.BeginForm("index", "NewsUpload", FormMethod.Post, new { name = "form1", @id = "form1" }))
{
@Html.ValidationSummary(true)
<div class="field fullwidth">
<label for="text-input-normal">
@Html.Label("Select Active Date Time")</label>
<input type="text" id="active" value="@DateTime.Now" />
@Html.ValidationMessageFor(model => model.ActiveDateTime)
</div>
<div class="field fullwidth">
<label>
@Html.Label("Select Language")
</label>
@Html.DropDownList("Language", (SelectList)ViewBag.lang)
</div>
<div class="field">
<label>
@Html.Label("General News")
</label>
@Html.TextBoxFor(model => model.generalnews, new { name = "files", @class="custom-file-input", type = "file" })
@Html.ValidationMessageFor(model => model.generalnews)
</div>
<div class="field">
<label>
@Html.Label("Sports News")
</label>
@Html.TextBoxFor(model => model.sportsnews, new { name = "files", @class = "custom-file-input", type = "file" })
@Html.ValidationMessageFor(model => model.sportsnews)
</div>
<div class="field">
<label>
@Html.Label("Business News")
</label>
@Html.TextBoxFor(model => model.businessnews, new { name = "files", @class = "custom-file-input", type = "file" })
@Html.ValidationMessageFor(model => model.businessnews)
</div>
<div class="field">
<label>
@Html.Label("International News")
</label>
@Html.TextBoxFor(model => model.internationalnews, new { name = "files", @class = "custom-file-input", type = "file" })
@Html.ValidationMessageFor(model => model.internationalnews)
</div>
<div class="field">
<label>
@Html.Label("Entertaintment News")
</label>
@Html.TextBoxFor(model => model.entertaintmentnews, new { name = "files", @class = "custom-file-input", type = "file" })
@Html.ValidationMessageFor(model => model.entertaintmentnews)
</div>
<footer class="pane">
<input type="submit" class="bt blue" value="Submit" />
</footer>
}
次のように、許可された拡張子のファイル アップロードを検証するためのデータ アノテーションを含むモデルを表示します。
public class UploadNewsModel
{
public DateTime ActiveDateTime { get; set; }
// public IEnumerable<SelectListItem> Language { get; set; }
[File(AllowedFileExtensions = new string[] { ".jpg", ".gif", ".tiff", ".png", ".pdf", ".wav" }, MaxContentLength = 1024 * 1024 * 8, ErrorMessage = "Invalid File")]
public HttpPostedFileBase files { get; set; }
}
コントローラー:複数のファイルを保存し、エラーが存在する場合はビューを返す
[HttpPost]
public ActionResult Index(UploadNewsModel news, IEnumerable<HttpPostedFileBase> files)
{
if (ModelState.IsValid)
{
foreach (var file in files)
{
if (file != null && file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var serverpath = Server.MapPath("~/App_Data/uploads/News");
var path = Path.Combine(serverpath, fileName);
if (!Directory.Exists(serverpath))
{
Directory.CreateDirectory(serverpath);
}
file.SaveAs(path);
}
}
}
return View(news);
}
}
問題の説明 アップロードされたファイルのファイル拡張子が許可されていないタイプの場合に、それぞれの検証エラーに対して対応するエラーが表示されるように、これら 5 つのファイル アップロード入力コントロールのビュー モデルを定義するにはどうすればよいですか。5 つのファイル アップロード コントロールすべてに対してビュー モデル項目が 1 つしかありません。
ユーザーが許可されていない拡張子のファイルをアップロードしようとする代わりに、それぞれの検証エラーを表示するための複数のファイルアップロードコントロールのビューモデルを定義する最良の方法は何ですか?