C# 使用HTML在MVC中提交表单
我有一个使用MVC5和C的web应用程序。在这个应用程序中,我有一个表单,其中有一个dropdownlist和一个submit按钮,如下所示: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
<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();
}