C# 使用HTML在MVC中提交表单

C# 使用HTML在MVC中提交表单,c#,html,asp.net-mvc,forms,post,C#,Html,Asp.net Mvc,Forms,Post,我有一个使用MVC5和C的web应用程序。在这个应用程序中,我有一个表单,其中有一个dropdownlist和一个submit按钮,如下所示: <form class="form-horizontal" action="@Url.Action("AssignTemplate", "TemplateMapper")" method="post"> <div class="control-group"> <label class="control

我有一个使用MVC5和C的web应用程序。在这个应用程序中,我有一个表单,其中有一个dropdownlist和一个submit按钮,如下所示:

<form class="form-horizontal" action="@Url.Action("AssignTemplate", "TemplateMapper")" method="post">
    <div class="control-group">
        <label class="control-label">Template:</label>
        <div class="controls">
            <select id="template">
                @foreach (KeyValuePair<int, string> entry in Model.templates)
                {
                    <option value="@entry.Key">@entry.Value</option>
                }
            </select>
        </div>
    </div>
    <div class="control-group">
        <div class="controls">
            <input type="button" class="btn btn-primary" value="Assign" onclick="location.href='@Url.Action("AssignTemplate", "TemplateMapper")'" />
        </div>
    </div>
</form>
然而,当我按下submit按钮时,我得到一个404,not found,即使该方法存在,并且我以post请求的形式声明它应该是一个post请求


我错过了什么?然后我的控制器如何访问dropdownlist上的信息?

您用于提交的按钮将在控制器方法上执行HTTP GET,因为它会在单击时更改文档url

您的控制器方法被[HttpPost]属性限制为HTTP POST,因此是404

您需要做的是使用submit类型的输入,它将表单发回表单标记中指定的操作,如下所示:

<input type="submit" class="btn btn-primary" value="Assign"  />
这是向服务器提交表单数据的简单而适当的方法

此外,您需要为select元素指定一个名称,以确保它的值绑定到控制器方法上的参数

<select id="template" name="templateId">

您当前正在各地使用Razor语法:

@Url.ActionAssignTemplate,TemplateMapper @Model.templates中的foreach KeyValuePair条目 @入口,钥匙 但以下是您应该做的:

视图:


假设您有一个名为AssignTemplate的视图,您的AssignTemplate方法应该接受包含文章中数据的模型,但是我认为这不是问题所在,因为它不会导致404。你能用Chrome inspector检查发布的内容吗?如果你查看源代码,action属性说它也会提交什么?404将与位置相关,路径可能不正确。为什么不使用razor语法?您已经在使用带有@Url.ActionAssignTemplate、TemplateMapper的razor语法。此外,您的输入应该是submit而不是button类型,不需要对onclick事件进行任何函数调用。您的ActionResult应该返回一个View@chiapa:是的,除此之外。我的意思是,我希望避免使用Html.BeginForm和其他类似的帮助程序。为什么我需要控制器中的两个参数来访问droplist中的一个值?这如何转换为控制器?select元素的名称用于构建表单提交,而您的控制器方法具有类似的命名参数,因此,MVC模型绑定器可以将选定的值指定给您的参数。
<select id="template" name="templateId">
<form class="form-horizontal" action="../TemplateMapper/AssignTemplate" method="post">
    <div class="control-group">
        <label class="control-label">Template:</label>
        <div class="controls">
            <select id="template" name="myDropDownList">
                @foreach (KeyValuePair<int, string> entry in Model.templates)
                {
                    <option value="@entry.Key">@entry.Value</option>
                }
            </select>
        </div>
    </div>
    <div class="control-group">
        <div class="controls">
            <input type="submit" class="btn btn-primary" value="Assign" />
        </div>
    </div>
</form>
public ActionResult AssignTemplate(string myDropDownList)
{
     return View();
}