私のコントローラーでは、ビデオに関する詳細を入力して実際にアップロードできるようにしたいので、別のWebサービスに渡されるため、Videoクラスは実際のビデオを必要としません。
public class VideoUploadModel
{
public HttpPostedFileBase vid { get; set; }
public Video videoModel { get; set; }
}
//
// POST: /Video/Create
[HttpPost]
public ActionResult Create(VideoUploadModel VM)
{
if (ModelState.IsValid)
{
db.Videos.AddObject(VM.videoModel);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId);
return View(VM);
}
私の見解では
@model LifeHighlightsShoeLace.Controllers.VideoController.VideoUploadModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
@using (Html.BeginForm("Create", "Video", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Video</legend>
<div class="editor-label">
@Html.LabelFor(model => model.videoModel.KalturaID)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.videoModel.KalturaID)
@Html.ValidationMessageFor(model => model.videoModel.KalturaID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.videoModel.Size)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.videoModel.Size)
@Html.ValidationMessageFor(model => model.videoModel.Size)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.videoModel.Date)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.videoModel.Date)
@Html.ValidationMessageFor(model => model.videoModel.Date)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.videoModel.UploadedBy)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.videoModel.UploadedBy)
@Html.ValidationMessageFor(model => model.videoModel.UploadedBy)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.videoModel.UserId, "User")
</div>
<div class="editor-field">
@Html.DropDownList("UserId", String.Empty)
@Html.ValidationMessageFor(model => model.videoModel.UserId)
</div>
<div class="editor-field">
<input name="model.vid" type="file" />
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
フォームを送信すると、VMのvideoModelの部分が入力されますが、実際のファイルがnullである場合に限ります。アイデアはありますか?
OPコメントに従って更新
web.configファイルに最大ファイル長を設定する「?」を変更する最大にしたいファイルサイズに、例えば65536は64MB
<configuration>
<system.web>
<httpRuntime maxRequestLength="?" />
</system.web>
</configuration>
モデルにファイルを追加することはできません。モデルの一部ではなく、独自のフィールドに含まれます
<input name="videoUpload" type="file" />
あなたの行動は間違っています。独自のパラメーターとしてファイルを受け入れる必要があります(または、複数の場合はIEnumerable<HttpPostedFileBase>
(パラメータタイプとして)
[HttpPost]
public ActionResult Create(VideoUploadModel VM, HttpPostedFileBase videoUpload)
{
if (ModelState.IsValid)
{
if(videoUpload != null) { // save the file
var serverPath = server.MapPath("~/files/" + newName);
videoUpload.SaveAs(serverPath);
}
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId);
return View(VM);
}
複数のファイルの選択を許可した場合は、それを許可する必要があります
[HttpPost]
public ActionResult Create(VideoUploadModel VM, IEnumerable<HttpPostedFileBase> videoUpload)
{
if (ModelState.IsValid)
{
if(videoUpload != null) { // save the file
foreach(var file in videoUpload) {
var serverPath = server.MapPath("~/files/" + file.Name);
file.SaveAs(serverPath);
}
}
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId);
return View(VM);
}
私のために働く:
public class CreateVeiwModel
{
public Speaker Speaker { get; set; }
public Guid Guid { get; set; }
public HttpPostedFileBase File { get; set; }
}
コントローラ:
[HttpPost]
public ActionResult Create(CreateVeiwModel model)
{
if (ModelState.IsValid)
try
{
Repository.AddSpeaker(model.Speaker);
...
}
見る:
@Html.Label("Most Up-to-Date CV")
<input type="file" name="File"/>
そこに解決策が置かれたと思います:Model.File
〜<input name="File"/>
バインドされていないのは、モデルバインダーがQueryString
、Form
、RouteData
のみを参照するためです。これを回避する方法は、アクションメソッドに別のパラメーターを含めることです。 (「名前」も「vid」だけに変更してください)
[HttpPost]
public ActionResult Create(VideoUploadModel VM, HttpPostedFileBase vid)
{
//add your vid to the model or whatever you want to do with it :)
if (ModelState.IsValid)
{
db.Videos.AddObject(VM.videoModel);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId);
return View(VM);
}
変化する
<input name="model.vid" type="file" />
に
@Html.TextBoxFor(model => model.vid, new {type="file"})
ページの他に何があるか、およびビューがレンダリングされる場所に応じて、MVCは一意のIDを生成します。ハードコードされたIDがフォームフィールドに正しく関連付けられていないと思います。