使用 HTML 在 MVC 中提交表单
Submit form in MVC using HTML
我有一个使用 MVC5 和 C# 的 Web 应用程序。在这个应用程序中,我有一个带有一个下拉列表和一个提交按钮的表单,如下所示:
<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>
我的 objective 在这里,没有使用 Razor Html Helper 语法,是向服务器发送一个 post 请求,其中包含在下拉列表中选择的信息。
为此,我有以下控制器代码:
public class TemplateMapperController : Controller
{
[HttpPost]
public ActionResult AssignTemplate(int templateId)
{
return null;
}
}
但是,当我按下提交按钮时,我得到一个 404,未找到,即使该方法存在并且我在表单中声明它应该是一个 post
请求。
我错过了什么?我的控制器如何才能访问下拉列表中的信息?
您用来提交的按钮将在您的控制器方法上执行 HTTP GET,因为它会在单击时更改文档 url。
您的控制器方法被 [HttpPost] 属性限制为 HTTP POST,因此是 404。
您需要做的是使用 "submit" 类型的输入,它将 post 将表单返回到表单标签中指定的操作,如下所示:
<input type="submit" class="btn btn-primary" value="Assign" />
这是向服务器提交表单数据的简单且合适的方法。
此外,您需要为 select 元素指定一个名称,以确保它的值绑定到控制器方法中的参数
<select id="template" name="templateId">
您目前正在全面使用 Razor 语法:
- @Url.Action("AssignTemplate", "TemplateMapper")
- @foreach(Model.templates 中的 KeyValuePair 条目)
- @entry.Key
但这是你应该做的:
查看:
<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();
}
假设您有一个名为 AssignTemplate
的视图
我有一个使用 MVC5 和 C# 的 Web 应用程序。在这个应用程序中,我有一个带有一个下拉列表和一个提交按钮的表单,如下所示:
<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>
我的 objective 在这里,没有使用 Razor Html Helper 语法,是向服务器发送一个 post 请求,其中包含在下拉列表中选择的信息。
为此,我有以下控制器代码:
public class TemplateMapperController : Controller
{
[HttpPost]
public ActionResult AssignTemplate(int templateId)
{
return null;
}
}
但是,当我按下提交按钮时,我得到一个 404,未找到,即使该方法存在并且我在表单中声明它应该是一个 post
请求。
我错过了什么?我的控制器如何才能访问下拉列表中的信息?
您用来提交的按钮将在您的控制器方法上执行 HTTP GET,因为它会在单击时更改文档 url。
您的控制器方法被 [HttpPost] 属性限制为 HTTP POST,因此是 404。
您需要做的是使用 "submit" 类型的输入,它将 post 将表单返回到表单标签中指定的操作,如下所示:
<input type="submit" class="btn btn-primary" value="Assign" />
这是向服务器提交表单数据的简单且合适的方法。
此外,您需要为 select 元素指定一个名称,以确保它的值绑定到控制器方法中的参数
<select id="template" name="templateId">
您目前正在全面使用 Razor 语法:
- @Url.Action("AssignTemplate", "TemplateMapper")
- @foreach(Model.templates 中的 KeyValuePair 条目)
- @entry.Key
但这是你应该做的:
查看:
<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();
}
假设您有一个名为 AssignTemplate