私のルートコレクションには
routers.MapRoute( "Recalculate"、 "{siteLanguage} /Formula.mvc/relcalculate/ {identifierString} / {formulaId} / {wratio} / {customRecalcString}"、new {controller = "Formula"、action = "Recalculate"、 wratio = ""、customRecalcString = ""});
マップするアクションは
public ActionResult Recalculate(string identifierString, int formulaId, string wratio, string customRecalcString, string targetQuantity, int? targetUnit)
ご覧のとおり、ルートの説明にないいくつかのパラメータがあります。これらはオプションのパラメータです。
POSTを使用すると、フォームに入力した値がこれらのパラメーターに適切にマップされます。
ただし、GETを使用して入力すると、変数がクエリ文字列に追加されます。
/en/Formula.mvc/relcalculate/493133---GREEN%20TILE%20TEST%20PLAQUE---SPECTROSYSTEM/2972591?targetQuantity=1&targetUnit=1
しかし、アクションに到達すると、パラメーターとクエリ文字列は空になります...
何か案は?
編集
クエリ文字列が途中で消えたようです。このEdit2
を反映するようにOPを変更しまし
たさらに調査した後、失敗したように見えるasp.net-mvcのエンコーディングアルゴリズムに帰着するようです(またはそれは私ですか?)ブラウザのアドレスバーにURLを入力すると、機能します完全に。文字列がaction=""属性値として使用されている場合にのみ、クエリ文字列は消えます。間違えない場合は、クエリ文字列の「&」をエンコードする必要があります。
Url.RouteUrl()がこれを行わないのはなぜですか?
Url.Encode()が私にあらゆる種類の雄牛を与えるのはなぜですか?値をエンコードせずにクエリ文字列部分のみをエンコードするにはどうすればよいですか?
Edit3
アクションをHtml.Encode()で囲みました。これは、コースの最初から実行する必要がありました。これで、ページが再度検証されますが、役に立ちません。
Edit4
見つけた!
基本的に失敗しているのはこのHTMLです
<form action="/en/Formula.mvc/relcalculate/493133---GREEN%20TILE%20TEST%20PLAQUE---SPECTROSYSTEM/2972591?targetQuantity=50&targetUnit=0" method="get">
<div>
<input type="submit" class="noPrint" value="Remove RFU" />
</div>
</form>
フォームのメソッドをgetからpostに変更するとすぐに、すべてが正常に機能します。
それは2時間よく過ごしました!
コメントに応じて
更新:
非開示パラノイアに関して、私はいくつかのものを省略しますが、ここにページの要点があります:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="ReadyForUse.aspx.cs" Inherits="CommonProject.Web.Shared.Views.ProductMix.ReadyForUse" %>
<asp:Content ContentPlaceHolderID="headerContentPlaceHolder" runat="server">
<link href="<%=PathHelper.CssUrl("productMix.css")%>" rel="Stylesheet" type="text/css"/>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="mainContentPlaceHolder" runat="server">
<%string action = Url.RouteUrl("Recalculate",
new {
siteLanguage = ViewData.Model.SiteLanguage.Iso6391[0],
identifierString = ColorService.GetIdentifierString(ViewData.Model.ActiveColor),
formulaId = ViewData.Model.ActiveFormula.FormulaId,
targetQuantity = FormulaService.ParseQuantityFromVolumeString(ViewData.Model.TargetVolume),
targetUnit = FormulaService.ParseUnitFromVolumeString(ViewData.Model.TargetVolume).Id,
wratio = ViewData.Model.Wratio.ToString(),
customRecalcString = ProductMixService.GetCustomRecalcValuesString(ViewData.Model.GaugesStructure)
});
string removeAction = Url.RouteUrl("Recalculate",
new {
siteLanguage = ViewData.Model.SiteLanguage.Iso6391[0],
identifierString = ColorService.GetIdentifierString(ViewData.Model.ActiveColor),
formulaId = ViewData.Model.ActiveFormula.FormulaId,
targetQuantity = FormulaService.ParseQuantityFromVolumeString(ViewData.Model.TargetVolume).ToString(),
targetUnit = FormulaService.ParseUnitFromVolumeString(ViewData.Model.TargetVolume).Id,
});
%>
<snip/>
<table width="100%">
<tr>
<td width="50%">
<div>
<a href="<%=Html.Encode(action)%>" alt="test">thisWorks</a>
<form action="<%=Html.Encode(action)%>" method="get">
<div>
<input type="submit" value="thisDoesnt" />
</div>
</form>
</div>
</td>
<td width="50%">
<div>
<a href="<%=Html.Encode(removeAction)%>" alt="test">thisWorks</a>
<form action="<%=Html.Encode(removeAction)%>" method="get">
<div>
<input type="submit" value="thisDoesnt" />
</div>
</form>
</div>
</td>
</tr>
</table>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="javaScriptPlaceHolder" runat="server">
<script src="/Content/scripts/effects.core.min.js" type="text/javascript"></script>
<script src="<%=PathHelper.JsUrl("productMix.js")%>" type="text/javascript"></script>
</asp:Content>
私はページの最初にアクションURLを定義する傾向があるので、簡単に見つけることができ、ページが散らかることはありません。また、テーブルが冒涜的であることは知っていますが、昨日無駄にした時間で、当分の間それをしなければならないでしょう。後のサイクルでプログラマーの税金を支払う必要があります。