私は(モデルから作られた)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をビューにバインドすることはできません。そのようなメソッドにデータを渡すにはどうすればよいですか?
疑わしい場合は、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;
}
これは、フォームメソッドをGETとして指定したためです。
ビューのコードをこれに変更します:
using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){
}
FormMethod.Get
を使用してHTTP 'GET'リクエストを使用するフォームを指定しているようです。これは、ActionResultに実行させたいと思われる投稿を行うように指示しない限り機能しません。これはおそらくFormMethod.Get
をFormMethod.Post
に変更することで機能します。
これに加えて、GetリクエストとPostリクエストがどのように機能し、これらがモデルとどのように相互作用するかについても考えてください。
ここで問題は、クラスを指定した場合のモデルバインディングです。整数または文字列の場合、モデルバインディングはポスト中にそれを理解できます。その後、適切にバインドするには[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ファイルに追加されていることを確認してください。