C# 使用url中的一组固定参数和来自post或querystring的一组可选参数执行操作

C# 使用url中的一组固定参数和来自post或querystring的一组可选参数执行操作,c#,.net,asp.net-mvc,query-string,model-binding,C#,.net,Asp.net Mvc,Query String,Model Binding,在我的路线收集中,我有 routes.MapRoute 重新计算, {siteLanguage}/Formula.mvc/relcalculate/{identifierString}/{formulaId}/{wratio}/{customRecalcString}, 新建{controller=公式,action=重新计算,wratio=,customRecalcString=} ; 它映射到的操作是 public ActionResult Recalculate(string identi

在我的路线收集中,我有

routes.MapRoute 重新计算, {siteLanguage}/Formula.mvc/relcalculate/{identifierString}/{formulaId}/{wratio}/{customRecalcString}, 新建{controller=公式,action=重新计算,wratio=,customRecalcString=} ;

它映射到的操作是

public ActionResult Recalculate(string identifierString, int formulaId, string wratio, string customRecalcString, string targetQuantity, int? targetUnit)
如您所见,有几个参数不在路线描述中。 这些是可选参数。 当我带着帖子进来时,我在表单中输入的值会正确地映射到这些参数。 但是,当我使用GET输入时,变量将添加到querystring:

/en/Formula.mvc/relcalculate/493133---GREEN%20TILE%20TEST%20PLAQUE---SPECTROSYSTEM/2972591?targetQuantity=1&targetUnit=1
但是当到达操作时,参数和查询字符串是空的

有什么想法吗

编辑 似乎这一质询已经消失了一半。 修改了OP以反映这一点 编辑2 经过进一步调查,似乎又一次归结为asp.NETMVC的编码算法似乎失败了,还是我的错? 如果我在浏览器地址栏中填写URL,它将非常有效。 只有当字符串用作action=属性值时,查询字符串才会消失。 如果我没有弄错的话,查询字符串的“&”应该被编码

为什么Url.RouteUrl不这么做? 为什么Url.Encode给了我各种各样的谎言? 如何仅对查询字符串部分进行编码而不对值进行编码? 编辑3 我用Html.Encode包围了这个动作,从一开始我就应该这么做。现在页面再次验证。。但是没有用。 编辑4 找到了! 基本上是这个HTML失败了

<form action="/en/Formula.mvc/relcalculate/493133---GREEN%20TILE%20TEST%20PLAQUE---SPECTROSYSTEM/2972591?targetQuantity=50&amp;targetUnit=0" method="get">
    <div>
        <input type="submit" class="noPrint" value="Remove RFU" />
    </div>
</form>
一旦我将表单的方法从get改为post,一切都会顺利进行。 这两个小时花得很好! 使现代化 针对评论: 关于保密偏执狂,我将省略一些内容,但这是本页的要点:

<%@ 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,这样我就可以很容易地找到它,而且它不会乱扔我的页面。此外,我知道这张桌子是亵渎神明的,但随着我昨天浪费的时间,它将不得不暂时停止。在以后的一个周期里,我必须向程序员交税

我刚刚创建=>

控制器:

 public class FooController : Controller
    {
        public ActionResult Bar
            (string fizz1, int fizz2, string fizz3, string fizz4, 
             string fizz5, int? fizz6)
        {
            var sb = new StringBuilder();

            sb.AppendLine(string.Format("{0} | {1} | {2} | {3} | {4} | {5}", 
                fizz1, fizz2, fizz3, fizz4, fizz5, fizz6.HasValue ? fizz6.Value.ToString():""));

            return Content(sb.ToString());
        }

    }
global.asax:

 public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //routes.MapRoute(
            //    "Default",                                              // Route name
            //    "{controller}/{action}/{id}",                           // URL with parameters
            //    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            //);

            routes.MapRoute(
                    "FooBar",
                    "{siteLanguage}/bar/{fizz1}/{fizz2}/{fizz3}/{fizz4}",
                    new { controller = "Foo", action = "Bar", fizz3 = "", fizz4 = "" }
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
结果:

返回

起泡1 | 2 | | | val | 1


问题似乎在别处。是否有任何过滤器/模型绑定器正在执行某些操作

我想我找到了根本原因。OP中的Edit2试图解释更多。这里没有模型绑定器,除了板上的。对不起,我不明白。用Html.Encode包围标识符字符串是否有帮助?它没有。它帮助验证了我的页面,但没有解决问题。有关解决方案,请参见编辑4。它的工作方式。我仍然不明白为什么它以前不工作……您能显示您的.asp/cx标记吗?当出现类似情况时,可能会出现这种情况,而您不能仅仅切换到“POST”。