web-dev-qa-db-ja.com

フォームを送信し、FileStreamResult型のコントローラーメソッドにデータを渡す

私は(モデルから作られた)mvcフォームを持っていますが、それを送信すると、パラメータを取得したいのですが、フォームを設定してパラメータを取得するコードがあります

using (@Html.BeginForm("myMethod", "Home", FormMethod.Get, new { id = @item.JobId })){
}

そしてホームコントローラーの中に

    [HttpPost]
    public FileStreamResult myMethod(string id)
    {
         sting str = id;

    }

ただし、常にエラーが発生します

探しているリソース(またはその依存関係の1つ)が削除されたか、名前が変更されたか、一時的に使用できなくなっている可能性があります。次のURLを確認して、スペルが正しいことを確認してください。

[HttpPost]を省略すると、コードはファイルを実行しますが、変数strおよびidはnullです。どうすれば修正できますか?

編集

これは、コントローラーのmyMethodがActionResultではないために発生する可能性がありますか?メソッドがビューにバインドされているActionresult型のメソッドがある場合、すべてがうまく機能することに気付きました。ただし、タイプFileStreamresultをビューにバインドすることはできません。そのようなメソッドにデータを渡すにはどうすればよいですか?

33
jpo

疑わしい場合は、MVCの規則に従ってください。

JobIDのプロパティが含まれていない場合は、viewModelを作成します

public class Model
{
     public string JobId {get; set;}
     public IEnumerable<MyCurrentModel> myCurrentModel { get; set; }
     //...any other properties you may need
}

ビューを強く入力します

@model Fully.Qualified.Path.To.Model

JobIdの非表示フィールドをフォームに追加します

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post))
{   
    //...    
    @Html.HiddenFor(m => m.JobId)
}

そして、コントローラーアクションのパラメーターとしてモデルを受け入れます。

[HttpPost]
public FileStreamResult myMethod(Model model)
{
    sting str = model.JobId;
}
50
Forty-Two

これは、フォームメソッドをGETとして指定したためです。

ビューのコードをこれに変更します:

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){
}
14
CoffeeCode

FormMethod.Getを使用してHTTP 'GET'リクエストを使用するフォームを指定しているようです。これは、ActionResultに実行させたいと思われる投稿を行うように指示しない限り機能しません。これはおそらくFormMethod.GetFormMethod.Postに変更することで機能します。

これに加えて、GetリクエストとPostリクエストがどのように機能し、これらがモデルとどのように相互作用するかについても考えてください。

3
Alex

ここで問題は、クラスを指定した場合のモデルバインディングです。整数または文字列の場合、モデルバインディングはポスト中にそれを理解できます。その後、適切にバインドするには[FromBody]を指定する必要があります。

formMethodで次の変更を行います

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){

}

また、文字列をバインドするためのホームコントローラー内で、[FromBody]を指定する必要があります

using System.Web.Http;
[HttpPost]
public FileStreamResult myMethod([FromBody]string id)
{
     // Set a local variable with the incoming data
     string str = id;

}

FromBodyはSystem.Web.Httpで利用可能です。そのクラスへの参照があり、csファイルに追加されていることを確認してください。

3
Anto Subash