模型在Html.BeginForm之外是空的

时间:2017-08-08 09:59:15

标签: c# asp.net asp.net-mvc

堆栈上有很多这样的问题,但没有一个完全解决我的问题。

我有一个具有各种属性的模型,其中一个是列表:

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值解析为多个控制器方法?

1 个答案:

答案 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

或者,您可以将namevalue属性添加到多个按钮,并在单个方法中添加参数,以确定哪个按钮激活了提交

<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
    }