簡體   English   中英

在剃須刀中向表單添加參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM