将值传递给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方法,即使URL部分完成,或者甚至没有参数。在我的情况下,如果我只输入http://locahots:55904/search-result/
或http://locahots:55904/search-result/for-sale/
,意思是只要它是部分的,我总是以404结尾。但我希望它们重定向到另一个页面,如果它是部分网址。
我已经在我的操作方法中进行了检查,但该方法根本没有使用部分URL进行调用。
这是必需的,因为Google会分别抓取每个文件夹结构的网址以对其进行索引。
如何防止这种情况发生?
答案 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){}