0

ASP.NET MVC 4 を使用して VS2012 で単純な WebAPI プロジェクトを作成しました。これが私がやろうとしていることです。同じ URL を使用する 2 つの POST ベースのアクションが必要です。1 つを受け入れapplication/x-www-form-urlencodedてメソッドにルーティングし、FormDataCollection次に別のアクションを別のメソッドにルーティングするコンテンツのない POST にする必要があります。以下の簡略化されたコードを参照してください。

public class SampleController : ApiController
{
    public string Post(string x, int y, FormDataCollection data)
    {
        return "Post 1";
    }

    public string Post(string x, int y)
    {
        return "Post 2";
    }

}

投稿しようとすると (2 つの呼び出し、1 つはapplication/x-www-form-urlencodedコンテンツ タイプまたはなしtext/plain)、ルーティングが同様のメソッドと混同されているように見えるため、内部サーバー エラー (500) が発生します。2 つのいずれかをコメントアウトすると、すべてのシナリオでもう一方が呼び出されます。

この種の細かいルーティングは手動で処理する必要がありますか (それがどれほど厄介に見えるかに関係なく)、それとも何か不足していますか (属性など)。ありがとう!

4

1 に答える 1

-1

まず、次のクラスを作成します。

public class ButtonAttribute : ActionMethodSelectorAttribute
{
    public string ButtonName { get; set; }
    public override bool IsValidForRequest(
        ControllerContext controllerContext, 
        System.Reflection.MethodInfo methodInfo)
    {
        return controllerContext.Controller.ValueProvider
            .GetValue(ButtonName) != null;
    }
    public ButtonAttribute(string buttonName)
    {
        ButtonName = buttonName;
    }
}

次に、ビューで、name属性をボタンに追加します。

<form action="~/Sample/Post" method="post">
    <input type="text" name="x" value="test" />
    <input type="number" name="y" value="123" />
    <input type="submit" value="First button" name="submit1" />
    <input type="submit" value="Second button" name="submit2" />
</form>

Button最後に、コントローラーで、次のように属性を追加します。

[Button("submit1")]
public string Post(string x, int y, FormDataCollection formData)
{
    return "Post 1";
}

[Button("submit2")]
public string Post(string x, int y)
{
    return "Post 2";
}
于 2013-06-03T10:59:51.610 に答える