c# - 将参数添加到 Razor 中的表单

标签 c# razor asp.net-core

我的 View 中有此表单,它引导我在 Controller 中执行某些操作。问题是我不知道如何将参数传递给操作方法。

<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>

这是我的 Controller :

[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}

关于如何传递参数的任何想法?

最佳答案

长话短说 - 没有现成的方法可以将表单值映射到路由。

将值传回您的 mvc Controller 的最佳方式是拥有一个 View 模型。

创建一个搜索 View 模型。

//View Model
public class SearchViewModel{
    public string Query {get;set;}
    public string Category {get;set;}
}

在您的 Controller 中,您需要将其传递给您的 View 或部分 View 。 在 .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 中绑定(bind)你的 View 模型,你就可以开始了。

//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,您还必须更改您的 Controller 以在您的 get 方法中期望这些。您也可以只绑定(bind)模型,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();
    }
}

关于c# - 将参数添加到 Razor 中的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50123277/

相关文章:

c# - 将字节列表拆分为位置列表 C#

c# - .NET Standard 2.0项目中为什么可以添加.NET framework项目作为引用?

c# - 如何从 ASP.NET Framework 运行 package.json 脚本

asp.net-mvc-3 - @Html.DropDownList 宽度

c# - 如何生成 appsettings.<EnvironmentName>.json 文件?

azure - 如何由受信任的第三方承担您的 Azure 帐户的角色(类似于 AWS)

C# - 获取 A 类中使用的所有类型

c# - 网页浏览器不刷新样式表

c# - SendGrid 不发送电子邮件

asp.net-mvc-3 - MVC 3 Razor将父/子表显示为一张表