[解決済み] MVC 3 ファイルアップロードとモデルバインディング
2023-03-24 01:45:48
質問
フォームからのアップロードはうまくいくのですが、データベースにモデル情報を渡して、もちろん違う名前でファイルを保存したいのです。
以下は私のRazorビューです。
@model CertispecWeb.Models.Container
@{
ViewBag.Title = "AddDocuments";
}
<h2>AddDocuments</h2>
@Model.ContainerNo
@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
<input type='file' name='file' id='file' />
<input type="submit" value="submit" />
}
以下は私のControllerです。
[HttpPost]
public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"),
containers.ContainerNo);
file.SaveAs(path);
}
return RedirectToAction("Index");
}
モデルの情報はコントローラには渡されません。モデルを更新する必要があるかもしれないと読みましたが、どのようにすればよいのでしょうか?
どのように解決するのですか?
フォームにはファイル以外の入力タグがないので、コントローラアクションではアップロードされたファイル以外のものを取得することはできません (サーバに送信されるのはこれだけです)。これを実現する一つの方法は、モデルの ID を含む hidden タグを含めることです。これにより、投稿先のコントローラアクション内でデータストアからモデルを取得することができます (ユーザがモデルを変更せず、単にファイルを添付することを想定している場合に、この方法を使用します)。
@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.HiddenFor(x => x.Id)
<input type="file" name="file" id="file" />
<input type="submit" value="submit" />
}
を作成し、コントローラのアクションで
[HttpPost]
public ActionResult Uploadfile(int id, HttpPostedFileBase file)
{
Containers containers = Repository.GetContainers(id);
...
}
一方、ユーザーがこのモデルを変更できるようにしたい場合は、サーバーに送信したいモデルの各フィールドに対して適切な入力フィールドを含める必要があります。
@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.TextBoxFor(x => x.Prop1)
@Html.TextBoxFor(x => x.Prop2)
@Html.TextBoxFor(x => x.Prop3)
<input type="file" name="file" id="file" />
<input type="submit" value="submit" />
}
で、デフォルトのモデルバインダーがリクエストからこのモデルを再構築するようにします。
[HttpPost]
public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
{
...
}
関連
-
[解決済み】Automapperにタイプマップの設定がない、またはマッピングがサポートされていない - エラー
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] MVCにおけるViewModelとは?
-
[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?
-
[解決済み】cshtmlテンプレートで関数を作成する方法は?
-
[解決済み】Html.ActionLinkを使用して別のコントローラのアクションを呼び出す
-
[解決済み】AutoMapper.CreateMapsをどこに配置するか?
-
[解決済み] X-SourceFilesヘッダーは何をするものですか?
-
[解決済み] ASP.NET MVC: UrlHelperを使用するコントローラのユニットテスト
-
[解決済み] HTMLヘルパーでURLを生成する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] プロジェクトのデフォルトのXMLネームスペースはMSBuild XMLネームスペースである必要があります。
-
[解決済み] DI向けNinjectとUnityの比較【終了しました
-
[解決済み] 既存のデータベースの選択されたテーブルからDbContextをScaffoldすることができますか[重複]。
-
[解決済み】ASP.NET RazorのHTML.ActionLinkとUrl.Actionの比較
-
[解決済み】サービスは常にDTOを返すべきですか、それともドメインモデルも返すことができますか?
-
[解決済み】ASP.NET MVC 3 Razor - EditorForにクラスを追加する。
-
[解決済み] ASP.Net MVC デフォルトの HTTP ヘッダーを削除する方法は?
-
[解決済み] ASP.NET MVCコントローラから外部URIへのリダイレクト
-
[解決済み] ASP.NET MVC: UrlHelperを使用するコントローラのユニットテスト
-
[解決済み] ソートロジックは、モデル、ビュー、コントローラのいずれに配置するのがよいのでしょうか?[クローズド]