2011-08-04 99 views
1

我是相当新的ASP.NET和C#,我有我的路由的一些问题。希望有人能帮助我。C#ASP.NET MVC 2基本的路由

用户应该给出3个参数(string,bool,bool)。 所以,我有我的索引页上的一个小表格:

<% using (Html.BeginForm("search", "Home")) { %> 
     <label >Name: </label><br /> 
     <input type="text" id='ml' name='ml' /><br /> 
     <label >Sort members alphabethic? </label> <input type="checkbox" id='sortalph' name='sortalph' /><br /> 
     <label >Number the list? </label><input type="checkbox" id='number' name='number' /><br /> 
     <input type="submit" value='Submit'/> 
    <% } %> 

Global.asax.cs设置是这样的:

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

Search方法在我HomeController开始看起来是这样的:

public ActionResult Search(string ml, bool? sortalph, bool? number) 
{ 
    if (sortalph == null) 
    { 
     sortalph = false; 
    } 
    if (number == null) 
    { 
     number = false; 
    } 

当调试sortalphnumber总是null。我不知道为什么。

+0

只是好奇:你为什么使用空值? –

+0

@丹,我用nullables太频繁,这样我就可以缺少一个干净的URL /后与参数之间区分(因此使用默认,可能是“真”),当它实际上是通过故意“假”或' 0'而无需咨询价值提供商 –

回答

1

你并不需要添加一种特殊的路由这些,因为他们只是要通过浏览器被添加到查询字符串,或进入后身体如果表单后,提交表单时。

因此,如果浏览器做了GET,那么它实际上形成URL /home/search?ml=[whatever]&sortalph=[whatever]&number=[whatever]。 MVC自动将参数按名称映射到查询字符串中的值。

如果您注释掉路线你会发现,它都将开始工作。

1

问题是严格相关的两个因素:在操作方法

  • 你的布尔参数不应该为空。使用bool而不是bool?
  • 您在html上的复选框应该有value="true",因此当它们被选中时,会发送正确的值并且属性会得到正确的值。

除此之外,您可以使用html helper方法而不是纯html来创建表单。您的html有许多缺陷,如缺少for属性的标签等。

此外,由于它是一种搜索表单,因此您应该使用HTTP GET方法使搜索结果成为可索引和可​​收藏的,但您并未指定它并且BeginForm的默认超载将使用HTTP POST方法呈现表单标记。

+0

好的,谢谢你的帮助,并给出一些提示^^ – Reinard