【问题标题】:Send Selected DropDownList value to HomeController ActionResult将 Selected DropDownList 值发送到 HomeController ActionResult
【发布时间】:2017-09-28 15:34:55
【问题描述】:

您好,我有一个下拉列表,该列表由配置中的逗号分隔值填充。这工作正常。

我要做的是将按钮单击时选择的值发送到 HomeController 中的 ActionResult。

我创建了一个模型,它接受一个字符串。当我点击按钮时出现错误:

未找到视图“TestAction”或其主视图,或者没有视图引擎支持搜索到的位置。

这是我的控制器的样子:

    [HttpPost]
    [ActionName("TestAction")]
    public ActionResult TestAction(SQL_Blocks_App.Models.DropdownList SelectedValue)
    {

        //System.Diagnostics.Debug.WriteLine(SelectedValue);



        return View();
    }

这是我的模型的样子:

public class DropdownList
{
    //
    // GET: /DropdownList/
    [Display(Name = "Servers")]
    public string SelectedValue{ get; set; }



}

这就是我的索引视图的样子:

    <form id="SelectedValue" action="/Home/TestAction" method="post" style="margin: 0">
       <div class="col-lg-5">
            @{
            ViewBag.Title = "Index";
            }
            @Html.DropDownList("YourElementName", (IEnumerable<SelectListItem>)ViewBag.DropdownVals, "--Choose Your Value--", new

            {

               //size = "5",
               style = "width: 600px"

            })


        </div>
        <div class="col-lg-5">
            <input type="submit" value="Run Query" />

            <input id="Button2" type="button" value="Clear" onclick="window.location.reload()" />

        </div>
    </form>

我想澄清一下。我的最终目标是在 ActionResult 的 SQL 查询中使用选定的值,并将结果返回给索引,以便我可以将它们填充到表中。 (您现在不必向我展示如何执行 SQL 部分,我只想看到所选值至少打印在输出中。)

【问题讨论】:

  • 关于您的视图的快速问题:为什么要显式构建表单而不是:“@using (Html.BeginForm() { @Html.AntiForgeryToken() ... }”?您可以搭建查看并列出您想要在控制器的 POST 方法中使用您选择的名称的绑定。
  • @CodeBreaker 我不确定你刚才说了什么。我是 MVC 的新手。任何文档或我可以参考的东西? HTML.BeginForm 和我的做法有什么区别?
  • 别担心!请查看此处的 MS Doc:msdn.microsoft.com/en-us/library/…。它为 BeginForm() 方法和您可以传递给它的参数提供了一些上下文。本质上,Razor 视图文件中的 BeginForm() 将为您创建 HTML 表单,尽管它可以非常容易地传递动作名称、控制器名称等,并使用 Html.SelectList 或 Html.SelectListFor 将数据传回控制器基于视图中的选择列表名称。我也会创建一个答案来帮助解释。
  • 如果可以,尝试使用 MVC 项目的 Scaffolded Item 功能,方法是右键单击项目中的 Views 文件夹,然后将鼠标悬停在“Add >”上并单击“New Scaffolded Item... " 菜单中的选项。这将自动为模型项(表对象、视图模型等)构建所有视图以及控制器和操作,或者它将创建一个空白控制器和视图供您自己填写。如果您提前完成工作以确保您的模型(数据库表结构、视图模型等)强大,脚手架项目非常棒。

标签: c# asp.net asp.net-mvc-4 model actionresult


【解决方案1】:

重定向到索引动作,并传递参数

[HttpPost]
[ActionName("TestAction")]
public ActionResult TestAction(SQL_Blocks_App.Models.DropdownList _selectedValue)
{

    //System.Diagnostics.Debug.WriteLine(SelectedValue);



    return RedirectToAction("Index", "[Controller]", new {@_selectedValue = _selectedValue });
}

然后您的 Index 方法应该接受该参数。

[HttpGet]
public ActionResult Index(SQL_Blocks_App.Models.DropdownList _selectedValue)
{
  //use _selectedValue
}

我建议使用除索引之外的其他方法,或将 Dropdownlist 设为可为空/为其设置默认值。

【讨论】:

    【解决方案2】:

    return View() 的默认框架行为是返回一个与当前正在执行的操作同名的视图。这是TestAction。错误是告诉你没有找到这样的视图。

    您有几个选择。您可以创建视图,也可以返回其他内容。例如,如果你想重定向回Index,那么你可以返回一个重定向结果:

    return RedirectToAction("Index");
    

    也可以在响应中指定Index 视图:

    return View("Index");
    

    但是,请记住,该 URL 仍将用于 TestAction用于Index,如果您“不知道这一点。


    编辑:根据 cmets on this answer,听起来您真正想要的是构建通常在同一视图上运行的 pair 动作。这对于 index 视图并不特别常见,但对于 edit 视图却很常见。唯一的区别是语义,从结构上讲,这个概念适用于任何地方。

    考虑两个动作:

    public ActionResult Index()
    {
        // just show the page
        return View();
    }
    
    [HttpPost]
    public ActionResult Index(SQL_Blocks_App.Models.DropdownList SelectedValue)
    {
        // receive data from the page
        // perform some operation
        // and show the page again
        return View();
    }
    

    这两个操作之间的请求仅因 HTTP 动词(GET 或 POST)不同,而与 URL 上的操作名称不同。该名称将始终为“索引”。但是当索引视图上的表单通过 POST 提交并具有“SelectedValue”时,会调用第二个操作而不是第一个操作。

    在第二个动作中,您将执行数据库交互,收集您需要的任何数据,并在必要时在响应中包含模型或一些其他数据。

    【讨论】:

    • 我在帖子底部添加了更多信息只是为了澄清。我不想要一个新视图,只想返回结果索引。
    • @Abdul:什么结果?目前没有“结果”被发送到任何视图,无论该视图是否存在。重定向可以包含信息,但请注意该信息将在 URL 查询字符串中。相反,您可以使用[HttpPost] 属性将TestAction 重命名为Index 的重载,然后您只需要处理一个动作名称。从客户的角度来看,这看起来像是一个向自己发布的页面,这很常见。
    • 我之前编辑了我的帖子,不确定您是否在我的原始帖子底部看到了新信息。
    • @Abdul:在这种情况下,您可能想要做的是将您的TestAction 重命名为Index,并将所有内容保留在同一个 URL 上。这对于 index 动作/视图不一定很常见,但对于“编辑”动作/视图之类的东西非常常见。而HttpGet 版本的操作只是返回表单,而HttpPost 版本的操作接受表单值并在再次返回表单之前执行一些逻辑。
    • 我试过了,效果很好。唯一奇怪的是,当我尝试打印 SelectedValue 时,它​​只打印“SQL_Blocks_App.Models.DropdownList”,而不是选择的实际值。有什么想法吗?
    【解决方案3】:

    您的 TestAction 方法正在返回一个视图。确保 View TestAction.cshtml 存在并且位于 Home 文件夹中。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多