Вот как я обошел это; надеюсь, кому-то еще может пригодиться мое решение.
Подпись сообщения изменяется; Параметры - это список всех имен кнопок различных форм. Chrome / FF заполнит эти имена, поэтому вам не нужно будет их анализировать.
[HttpPost()]
[UrlRoute(Path = "Checkout/Cart")]
public ActionResult Cart(ShoppingCartModel cart, string removeSelected, string nextButton)
{
if (removeSelected == ShoppingCartModel.REMOVE_SELECTED)
removeOp = true;
else if (nextButton == ShoppingCartModel.NEXT_BUTTON)
nextOp = true;
else
{
PostbackButtonParser parser = new PostbackButtonParser(HttpContext.Request.InputStream, new string[] { ShoppingCartModel.NEXT_BUTTON, ShoppingCartModel.REMOVE_SELECTED });
if (parser.PostbackButtonName == ShoppingCartModel.NEXT_BUTTON)
nextOp = true;
else if (parser.PostbackButtonName == ShoppingCartModel.REMOVE_SELECTED)
removeOp = true;
}
if(removeOp) { /* do something */ }
else if (nextOp) { /* do something */ }
}
Тогда код PostbackButtonParser довольно прост:
/// <summary>
/// Implements a fallback rollover for Internet Explorer and other browsers which don't send the value with an INPUT TYPE="IMAGE" submit.
/// </summary>
/// <example>
/// PostbackButtonParser parser = new PostbackButtonParser(HttpContext.Request.InputStream, new string[] { "button1", "button2" });
/// if(parser.PostbackButtonName == "button1") {
/// // do something
/// }
/// else if (parser.PostbackButtonName == "button2" {
/// // do something else
/// }
/// </example>
/// <remarks>See /4785667/est-li-oshibka-v-input-type-image-v-internet-explorer</remarks>
public class PostbackButtonParser
{
/// <summary>
/// Gets the name of the button which caused the postback.
/// </summary>
public string PostbackButtonName
{
get;
private set;
}
/// <summary>
/// Creates a new instance of the postback button parser
/// </summary>
/// <param name="requestStream">The stream to process</param>
/// <param name="buttonNames">An array of button names to evaluate gainst</param>
public PostbackButtonParser(Stream requestStream, string[] buttonNames)
{
byte[] stream = new byte[requestStream.Length];
requestStream.Read(stream, 0, stream.Length);
string contents = System.Text.Encoding.ASCII.GetString(stream);
for (int i = 0; i < buttonNames.Length; i++)
{
// Set first match
if (contents.Contains(buttonNames[i] + ".x") && contents.Contains(buttonNames[i] + ".y"))
{
PostbackButtonName = buttonNames[i];
break;
}
}
}
}
Я действительно надеюсь, что это кому-то поможет; Я потратил несколько часов на то, что действительно должно было быть тривиальным. То, что сказал Дарин, очень верно, я мог бы создать стиль, но я бы предпочел использовать тип изображения только для семантики.