基本的に製品間の比較を行う比較ページがあります。比較ページはbeginformでまとめられており、フォーム内には、リストされた各製品に対して表示される少なくとも比較ボタンと選択ボタンがあります。
名前が示すように、比較ボタンは別のページをロードして、選択した製品を比較します。選択ボタンを押すと、選択した商品がカートに追加されます。
比較ボタンと選択ボタンの間でアクションを分離する方法はありますか?
基本的に製品間の比較を行う比較ページがあります。比較ページはbeginformでまとめられており、フォーム内には、リストされた各製品に対して表示される少なくとも比較ボタンと選択ボタンがあります。
名前が示すように、比較ボタンは別のページをロードして、選択した製品を比較します。選択ボタンを押すと、選択した商品がカートに追加されます。
比較ボタンと選択ボタンの間でアクションを分離する方法はありますか?
これは私が思う2つの方法で行うことができます。
比較ボタンにHtml.ActionLinkを使用して、別のメソッド/コントローラーを呼び出します。このように、あなたのフォームだけが投稿されないので、引数に何かを渡す必要があります:
@using(Html.BeginForm("SomeController","Select"))
{
<button name="selectBtn" value="select">Select</button>
@Html.ActionLink("Click to Compare", "SomeOtherController", "Compare"
new { id1=xx, id2=yy },//pass parameters accordingly
null
)
}
ActionLinkメソッドのこのオーバーロードを使用しました。
また
ここで本当にボタンが必要な場合は、2つのボタンを使用して、コントローラーで呼び出されたボタンを検出し、リダイレクトすることができます。
@using(Html.BeginForm("CommonController","Select"))
{
<button name="button" value="select">Select</button>
<button name="button" value="compare">Compare</button>
}
あなたのコントローラー:
public class CommonController : Controller
{
public ActionResult Select(string button)//same as the name property of <button>
{
if(button == "compare")
{//do something if you need to
//you could again pass in data as part of the route here..
return RedirectToAction("SomeController", "Compare");
}
}
}
これは HTML の制限であり、1 つのフォーム要素内で別の URL に投稿することはできません。これを実現するには、javascript を使用する必要があります。ボタンをクリックすると、javascript メソッドを呼び出し、フォームのアクション URL を比較または選択 URL のいずれかに設定する必要があります。このようなもの
function OnButton1()
{
document.Form1.action = @url.Action(new {Controller = ctrl1, Action = action });
document.Form1.submit(); // Submit the page
return true;
}
function OnButton2()
{
document.Form1.action = @url.Action(new {Controller = ctrl2, Action = action });
document.Form1.submit(); // Submit the page
return true;
}