[英]Add parameters to the form in razor
我認為此表格會導致我在控制器中執行某些操作。 問題是我不知道如何將參數傳遞給action方法。
<form class="full-search" asp-controller="Movies" asp-action="Search">
<input type="search" name="searchmovie" placeholder="Search..." class="search-form">
<select name="option" form="">
<option name="option" value="category1">category 1</option>
<option name="option" value="category2">category 2</option>
<option name="option" value="category3">category 3</option>
</select>
<i class="fas fa-caret-down"></i>
<input type="submit" name="" class="submit-full-search">
<div class="search-btn-submit">
<img src="~/img/search.svg">
</div>
</form>
這是我的控制器:
[HttpGet("searchmoview/{option?}/{searchmovie}")]
public IActionResult Search(string option, string searchmovie)
{
//perform some search based on the filters
return View("Search", data);
}
但是,當我運行代碼時,單擊搜索時,URL看起來像這樣:
https://localhost:33590/Information/Search
而不是像這樣:
https://localhost:44320/seachmovie/category1/{searchString}
關於如何傳遞參數的任何想法嗎?
你不能 事情不是這樣的。 默認情況下,表單將發送POST請求,在這種情況下,表單中的輸入將作為請求正文的一部分發送(即,不是URL)。 您可以將方法設置為GET,但是輸入值將作為查詢字符串的一部分(即?foo=bar
)發送,而不是您要查找的路徑的一部分。
遠程實現所需目標的唯一方法是使用JavaScript基於類別選擇框更改之類的內容來操縱表單的動作。 您將綁定到該元素的change
事件,然后以某種方式更改form元素的action
屬性。
長話短說-沒有現成的將表單值映射到路線的方法。
將值傳遞回mvc控制器的最佳方法是擁有視圖模型。
創建搜索視圖模型。
//View Model
public class SearchViewModel{
public string Query {get;set;}
public string Category {get;set;}
}
在您的控制器中,您需要將此傳遞到您的視圖或局部視圖。 在.NET中使用“ ActionResult”,在.Net Core中使用“ IActionResult”
//Controller
public class SearchController{
[HttpGet]
public ActionResult SearchBox(){
return View();
}
[HttpPost]
public ActionResult SearchBox(SearchViewModel model){
//model is now populated with your values from your form.
//ex: model.Query
return View();
}
}
為您的類別創建一個枚舉,還有許多其他方法可以做到這一點,但這是最簡單的。
//Enum
public enum Categories
{
Category1,
Category2
}
現在,在剃刀視圖中綁定視圖模型,您就可以開始工作了。
//Razor View
@model SearchViewModel
@using (Html.BeginForm("SearchBox", "Search", FormMethod.Post))
{
@Html.TextBoxFor(x => x.Query, new { @class = "search-form"})
@Html.DropDownListFor(x => x.Catergory,
new SelectList(Enum.GetValues(typeof(Categories))),
"Select Category", new { @class= "example-class"})
<i class="fas fa-caret-down"></i>
<input type="submit" name="" class="submit-full-search">
<div class="search-btn-submit">
<img src="~/img/search.svg">
</div>
}
如果您希望將表單值發布到您的網址,則可以將其更改為FormMethod.Get。
//Razor View
@model SearchViewModel
@using (Html.BeginForm("SearchBox", "Search", FormMethod.Get))
{
@Html.TextBoxFor(x => x.Query, new { @class = "search-form"})
@Html.DropDownListFor(x => x.Catergory,
new SelectList(Enum.GetValues(typeof(Categories))),
"Select Category", new { @class= "example-class"})
<i class="fas fa-caret-down"></i>
<input type="submit" name="" class="submit-full-search">
<div class="search-btn-submit">
<img src="~/img/search.svg">
</div>
}
如果將其更改為get,則還必須更改控制器以在get方法中期望它們。 您也可以只綁定模型,MVC會自動將參數映射回模型。
public class SearchController{
[HttpGet]
public ActionResult SearchBox(SearchViewModel model){
//if the model values are in the URL "model" will be populated, else it will be null.
return View();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.