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

Asp.net mvc 4 ASP.NET MVC:提交表单时,action方法中的第一个参数始终为空,asp.net-mvc-4,Asp.net Mvc 4,我在将值传递给控制器操作方法时遇到问题 我有一张这样的路线图: routes.MapRoute( name: "VehicleAdvancedSearchResult", url: "search-result/{searchTypeSlug}/{condition}/{makeSlug}/{modelName}/{modelExt}/{categorySlug}/{parishSlug}/{yearRange}/{priceRange}", defaults: new

我在将值传递给控制器操作方法时遇到问题

我有一张这样的路线图:

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
      }
   );
我尝试了
urlparmeter.Optional
,但没有成功

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

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

我做错了什么

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

我已经在我的action方法中完成了这个检查,但是该方法根本没有被部分URL调用

这是必需的,因为谷歌会用每个单独的文件夹结构对URL进行爬网,以对它们进行索引


如何防止这种情况发生?

对于控制器方法,如果要部分调用,则需要在方法中定义可选参数

比如说,

Public ActionResult <method name>(string param1="",string param2=""){}
Public ActionResult(string param1=“”,string param2=“”){
现在,若要使用部分参数调用方法,则需要从右向左传递参数


或者另一种方法是,您可以使用您拥有的不同参数选项覆盖方法。

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

routes.MapRoute(
   name: "VehicleAdvancedSearchResult_V2",
   url: "search-result/{parameterName?}",
  defaults: new
  {
     controller = "SearchResult",
     action = "VehicleAdvanceSearch",
   }
  );
第二种方法是,可以使用Route属性对此操作应用属性Routing。 例如:

 [Route("[action]/{parameterName?}")] //?--> for optional parameter
 public ActionResult VehicleAdvanceSearch()
 [HttpPost]
 public ActionResult VehicleAdvanceSearch(SearchResultModel model){}
为了解决第一个参数为null的问题,您可以为所有参数创建一个模型,然后使用Modal作为参数点击控制器操作。 例如:

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

听起来很有趣!我会尝试一下,然后再给你回复。感谢您的输入:)