0

ページのフォーム データを検証しようとすると、次のエラーが発生します。

System.ArgumentOutOfRangeException: インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。
パラメーター名: インデックス。

このページの私のコードは次のとおりです。

@{
var db= Database.Open("Games");
var sqlQ = "SELECT * FROM Games";
var data = db.Query(sqlQ);
Page.Title = "Add Game"; 
}
@{
    var fileerrorMessage = "";
    var NameerrorMessage = "";
    var Gamefile = "";
    var GameName = "";
    var fileData = Request.Files[0];
    var fileName = Path.GetFileName(fileData.FileName);
    var fileSavePath = Server.MapPath("~/upload/" + fileName);
    GameName=Request["formName"];
    Gamefile=fileName;
    if (IsPost) {
    var isValid = true;
        if (Gamefile.IsEmpty()){
            fileerrorMessage = "Please upload a file.";
            isValid = false;
        }

        else if (GameName.IsEmpty()){
            NameerrorMessage = "Please give the game a name.";
            isValid = false;
        }

        if (isValid){

        fileData.SaveAs(fileSavePath);
        var SQLINSERT = "INSERT INTO Games (Name, file_path) " + "VALUES (@0, @1)";
        db.Execute(SQLINSERT, GameName, Gamefile);
        Response.Redirect("default.cshtml");
        }

        else
        {
            <p class="message error">Please correct the errors and resubmit the form.</P> 
        }

    }
}
<form action="" method="post" enctype="multipart/form-data">

  <input type="file" name="file" id="file" />
    @if(!fileerrorMessage.IsEmpty()) {
        <label for="file" class="validation-error">
            @fileerrorMessage
        </label>
    }
  <p><input type="text" name="formName" value="@GameName" />
     @if(!NameerrorMessage.IsEmpty()) {
        <label for="file" class="validation-error">
            @NameerrorMessage
        </label>
    }

  <input type="submit" value="Add Game" />
</form>

エラーは明らかに 12 行目にあります。これは、以下に何か問題があることを意味します。var fileData = Request.Files[0];

4

1 に答える 1

1

アップロードされたファイルがないときにインデックスでRequest.Filesを参照しようとすると、このエラーが発生します。ページが最初に読み込まれたときにコードが実行されるため、ユーザーはファイルをアップロードする機会がありません。つまり、Request.Filesは空になります。

if(IsPost)宣言の上に移動しfileData、Request.Filesの数を確認してから、その中の何かを参照してください。

if(IsPost){
    if(Request.Files.Count > 0){
        var fileData = Request.Files[0];
        var fileName = Path.GetFileName(fileData.FileName);
        var fileSavePath = Server.MapPath("~/upload/" + fileName);
        //etc
于 2012-04-10T04:42:22.313 に答える