堆栈上有很多这样的问题,但没有一个完全解决我的问题。
我有一个具有各种属性的模型,其中一个是列表:
public class MyModel
{
....
public List<ValuesViewModel>Values { get; set; }
}
ValuesViewModel
的位置:
public class ValuesViewModel
{
public string Name { get; set; }
public string StatusOne { get; set; }
public string StatusTwo { get; set; }
}
我已经成功地使用下拉列表在我的视图中输出它们来修改这样的值:
@using (Html.BeginForm("GenerateReport", "Job", method: FormMethod.Post))
{
<div class="container">
@{
List<SelectListItem> statuses = new List<SelectListItem>();
statuses.Add(new SelectListItem
{
Text = "Bad",
Value = "Bad"
});
statuses.Add(new SelectListItem
{
Text = "Fair",
Value = "Fair",
Selected = true
});
statuses.Add(new SelectListItem
{
Text = "Good",
Value = "Good"
});
for (int i = 0; i < Model.Values.Count; ++i)
{
@Html.EditorFor(model => Model.Values[i].Name)
<p>Status One @Html.DropDownListFor(model => Model.Values[i].StatusOne, Values )</p>
<p>Status Two @Html.DropDownListFor(model => Model.Values[i].StatusTwo, Values )</p>
}
}
</div>
<button type="submit" class="btn btn-custom saveButtons ">Create report</button>
}
这样一切正常,模型会通过列表数据发布到我的Controller方法"GenerateReport"
,我很高兴。但!
我有几个按钮对应几种控制器方法,它们都使用来自List<ValuesViewModel>Values
的数据。
如果我把这个代码块:
for (int i = 0; i < Model.Values.Count; ++i)
{
@Html.EditorFor(model => Model.Values[i].Name)
<p>Status One @Html.DropDownListFor(model => Model.Values[i].StatusOne, Values )</p>
<p>Status Two @Html.DropDownListFor(model => Model.Values[i].StatusTwo, Values )</p>
}
在@HTML.BeginForm
之外,我的控制器方法中的模型将完全为空,即:
public ActionResult GenerateReport(MyModel model)
{
// model is null here!
}
public ActionResult GenerateShortReport(MyModel model)
{
// model is null here!
}
这里最蠢的解决方案是为每个按钮使用BeginForm
,但我希望并相信还有另一种方法。
如何在不重复每个按钮的整个下拉列表的情况下将我的List值解析为多个控制器方法?
答案 0 :(得分:2)
您可以在单个formaction
内使用<button>
元素的<form>
属性来提交不同的控制器方法(该属性会覆盖表单的操作属性。)
<button type="submit" formaction="@Url.Action("GenerateReport", "Job")">Create report</button>
<button type="submit" formaction="@Url.Action("GenerateShortReport", "Job")">Create short report</button>
请注意formaction
属性仅限HTML-5
或者,您可以将name
和value
属性添加到多个按钮,并在单个方法中添加参数,以确定哪个按钮激活了提交
<input type="submit" name="action" value="Create report" />
<input type="submit" name="action" value="Create short report" />
并在控制器中
public ActionResult GenerateReport(MyModel model, string action)
{
if (action == "Create report")
{
.... // code to generate standard report
}
else
{
.... // code to generate short version
}