9

ビューでこれを使用して作成されているドロップダウンリストを持つASP.NET MVC Webサイトがあります...

@Html.DropDownList("Programs")

プログラムは、ビジネス オブジェクト コレクションから生成され、ホーム コントローラーのインデックス アクションで ViewBag に詰め込まれます...

\\get items...
ViewBag.Programs = items;

ビューには、同じビューでこのように取得している可能性のある3つのファイルもあります...

<input type="file" name="files" id="txtUploadPlayer" size="40" />  
<input type="file" name="files" id="txtUploadCoaches" size="40" />  
<input type="file" name="files" id="txtUploadVolunteers" size="40" /> 

前述のすべてのコントロールは、...を使用してビューで作成されるフォームに含まれています。

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
     <!--  file and other input types  -->
     <input type="submit" name="btnSubmit" value="Import Data" />
}

私の問題は、すべてのファイルを処理し、フォーム フィールドを参照する方法が見つからないことです。

具体的には、ユーザーがドロップダウンから選択したプログラムを知る必要があります。

このコードを使用して問題なくファイルを処理できます...

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files)
//public ActionResult Index(FormCollection form)
{

    _tmpFilePath = Server.MapPath("~/App_Data/uploads");

    if (files == null) return RedirectToAction("Index");
    foreach (var file in files)
    {
        if (file != null && file.ContentLength > 0)
        {
            var fileName = Path.GetFileName(file.FileName);
            var path = Path.Combine(_tmpFilePath, fileName);
            if (System.IO.File.Exists(path)) System.IO.File.Delete(path);

            _file = file;

            file.SaveAs(path);

            break;  //just use the first file that was not null.
        }
    }



    //SelectedProgramId = 0;

    //DoImport();

    return RedirectToAction("Index");
}

しかし、POSTフォームの値、特にプログラムのドロップダウンで選択された値にアクセスする方法もわかりません(レコードには、値を読み取れないチェックボックスもあります)。フィドラーは、応答にファイル参照があることを示していますAND選択したプログラムですが、ASP.NET MVC を使用して POST からそれらを取得する方法がわかりません。

私はこの質問がかなり基本的なものであることを知っていますが、MVC だけでなく、web/http の全体をまだ学んでいます。

編集 回答ありがとうございます。その答えは、ファイルとフォームの値の両方を POST に渡すことにあるのではないかと考えました。

最後の質問は... HTML.BeginForm ブロックを変更して、ファイルとフォームの値の両方を渡すにはどうすればよいですか? 今、私は...

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  //do stuff
}

フォームの値とファイルの両方を ActionResult の個別のパラメーターとして取得するには、using ステートメントはどうすればよいでしょうか?

EDIT MY EDIT
変更を加える必要はないようです...デバッガーは、ファイルとフォームの両方が非 null であることを示しています。涼しい!そうですか?

4

2 に答える 2

8

これでやればいいと思う

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files, FormCollection form)
{
  //handle the files

  //handle the returned form values in the form collection
}

[HttpPost] アクションで 2 つのパラメーターを渡すことができるはずです。HTML 名を渡すこともできます。

編集: ASP.net のフォームにも問題がありました。Scott Allen によるこのブログ投稿を参照することをお勧めします。 http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx

于 2012-10-24T21:05:07.853 に答える
1

投稿されたファイルとフォームの値の両方を含む ViewModel 型を使用するか、HttpRequest(プロパティを介してアクセスされるController.Request) オブジェクトを使用します。.Form[key].Files[key]

于 2012-10-24T21:05:11.623 に答える