2

asp.netチュートリアルのFileUploadサンプルを使用しています。スタンドアロンとして構築すると、正常に動作します。ただし、その機能を新しいMVC4 Webサイトに追加しようとすると、ルーティングが間違っています。私はおそらくこれをうまく説明していないので、ここにコードがあります:

[HttpPost]
public async Task<HttpResponseMessage> PostFile()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    try
    {
        var sb = new StringBuilder(); // Holds the response body

        // Read the form data and return an async task.
        await Request.Content.ReadAsMultipartAsync(provider);

        // This illustrates how to get the form data.
        foreach(var key in provider.FormData.AllKeys)
        {
            var strings = provider.FormData.GetValues(key);
            if (strings != null) foreach(var val in strings)
            {
                sb.Append(string.Format("{0}: {1}\n", key, val));
            }
        }

        // This illustrates how to get the file names for uploaded files.
        foreach(var file in provider.FileData)
        {
            var fileInfo = new FileInfo(file.LocalFileName);
            sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n", fileInfo.Name, fileInfo.Length));
        }
        return new HttpResponseMessage
        {
            Content = new StringContent(sb.ToString())
        };
    }
    catch (System.Exception e)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
    }
}

これが私が使用しているページです:

<div style="height:400px;">
<h3>File Upload</h3>
<form name="trip_search" method="post" enctype="multipart/form-data" action="api/upload">
    <div>
        <input type="radio" name="trip" value="round-trip"/>
        Round-Trip
    </div>
    <div>
        <input type="radio" name="trip" value="one-way"/>
        One-Way
    </div>

    <div>
        <input type="checkbox" name="options" value="nonstop" />
        Only show non-stop flights
    </div>
    <div>
        <input type="checkbox" name="options" value="airports" />
        Compare nearby airports
    </div>
    <div>
        <input type="checkbox" name="options" value="dates" />
        My travel dates are flexible
    </div>

    <div>
        <label for="seat">Seating Preference</label>
        <select name="seat">
            <option value="aisle">Aisle</option>
            <option value="window">Window</option>
            <option value="center">Center</option>
            <option value="none">No Preference</option>
        </select>
    </div>
    <div>
        <input type="submit" value="Submit" />
    </div>

</form>

直接移動するlocalhost:13927api/uploadと、WebAPIメソッドからの応答が表示されます。WebApiConfigにDefaultApiルートを登録しました。

しかし、私がそのページにいて、送信ボタンをクリックすると、存在しない-localhost/Home/Aboutに移動しようとします。localhost/Home/api/upload

私は何が欠けていますか?

編集

マリオの提案で私の問題は解決しました。私のフォームのアクションメソッドは、ルートに関連していませんでした。

action="api/upload" vs. action="/api/upload"

それで私の問題は解決しました。

この問題について少し詳しく説明します。

デフォルトのパスを使用している場合(たとえば、yoursite / Home / Index->​​それがデフォルトの場合)、現在のパスが引き続きWebサイトのルートとして表示されるため、action = "api/myaction"が機能します。ただし、実際にパス(yoursite / Home / Aboutな​​ど)に移動すると、現在のパスは「Home」の下にあるため、欠落している「/」は当然、ルートではなく現在のパスに関連していました。問題のビューがデフォルトのビューであるため、サンプルが先頭の「/」なしで機能するのはこのためです。

4

1 に答える 1

2

それが他の人にも役立つ場合は、答えを追加しました:

あなたのフォームaction="api/upload"はルートに相対的ではありません。action="/api/upload"ヘルパーの1つを使用するか、ルートを指定してみてください。

于 2012-11-07T20:45:45.427 に答える