ASP.NET MVC:提交表单时,action方法中的第一个参数始终为空

时间:2018-04-27 06:12:26

标签: asp.net-mvc-4

将值传递给Controller操作方法时遇到问题。

我有这样的路线图:

routes.MapRoute(
   name: "VehicleAdvancedSearchResult",
   url: "search-result/{searchTypeSlug}/{condition}/{makeSlug}/{modelName}/{modelExt}/{categorySlug}/{parishSlug}/{yearRange}/{priceRange}",
   defaults: new
      {
         controller = "SearchResult",
         action = "VehicleAdvanceSearch",
         //SearchTypeSlug = UrlParameter.Optional
         //Condition = UrlParameter.Optional,
         //MakeSlug = UrlParameter.Optional,
         //ModelName = UrlParameter.Optional,
         //ModelExt = UrlParameter.Optional,
         //CategorySlug = UrlParameter.Optional,
         //ParishSlug = UrlParameter.Optional,
         //YearRange = UrlParameter.Optional,
         //PriceRange = UrlParameter.Optional
      }
   );

我尝试使用UrlParameter.Optional,但它没有用。

在视图中我有一个默认情况下没有定义action的表单,但是当我点击提交时,操作属性会添加到正确的值中。

action attribute is added to form with correct values and pattern

问题是当实际调用控制器方法时,第一个参数值总是以空字符串形式出现。

Debug result

我做错了什么?

另一个问题是我想要调用action方法,即使URL部分完成,或者甚至没有参数。在我的情况下,如果我只输入http://locahots:55904/search-result/http://locahots:55904/search-result/for-sale/,意思是只要它是部分的,我总是以404结尾。但我希望它们重定向到另一个页面,如果它是部分网址。

我已经在我的操作方法中进行了检查,但该方法根本没有使用部分URL进行调用。

这是必需的,因为Google会分别抓取每个文件夹结构的网址以对其进行索引。

如何防止这种情况发生?

2 个答案:

答案 0 :(得分:0)

对于控制器方法,如果要部分调用,则需要在方法

中定义可选参数

例如,

Public ActionResult <method name>(string param1="",string param2=""){}

现在,如果你想用部分参数调用方法,你需要从右到左传递参数。

或者另一种方法是你可以使用不同的参数覆盖方法。

答案 1 :(得分:0)

对于要通过partial url调用的此操作方法,可以在RouteConfig文件中创建一个新路由,该路由具有指向相同操作方法的不同路由名称。

routes.MapRoute(
   name: "VehicleAdvancedSearchResult_V2",
   url: "search-result/{parameterName?}",
  defaults: new
  {
     controller = "SearchResult",
     action = "VehicleAdvanceSearch",
   }
  );

第二种方法是您可以使用路径属性对此操作应用属性路由。 例如:

 [Route("[action]/{parameterName?}")] //?--> for optional parameter
 public ActionResult VehicleAdvanceSearch()

为了解决First Parameter null的问题,您可以为所有参数创建一个Model,然后使用Modal作为参数点击控制器操作。 例如:

 [HttpPost]
 public ActionResult VehicleAdvanceSearch(SearchResultModel model){}