【问题标题】:Model is null on post back in ASP.NET MVC模型在 ASP.NET MVC 中回发时为空
【发布时间】:2020-07-13 22:15:12
【问题描述】:

我正在尝试生成复选框列表并将所选项目发布到我的控制器的 post 方法,但我的视图模型为空。

请参阅下面的代码和帮助。

在另一个页面上使用以下按钮调用视图 -

<button class="btn btn-primary" id="historicalrecords"  
        onclick="location.href='@Url.Action("HistoricalWorkSubmissions", "Main", new {id= @Model.MessageIdsCombined.FirstOrDefault()})'">View Historical Works</button>

型号WorkSubmissions.cs

public class HistoricalWorkSubmission
{
    public string Society { get; set; }
    public string Rsa { get; set; }
    public DateTime ProcessingTime { get; set; }
    public bool isSelected { get; set; }

}

public class HistoricalWorkSubmisssionViewModel
{
    public List<HistoricalWorkSubmission> Submissions { get; set; }
}

MainController中的获取方法:

[HttpGet]
public async Task<ActionResult> HistoricalWorkSubmissions(string id)
{
    WorkSearchViewModel workSearchViewModel = new WorkSearchViewModel
            {
                MessageId = id
            };

    var workSubmissions = await _swvManager.SearchAllWorkSubmissionsAsync(workSearchViewModel).ConfigureAwait(true);

    return View("~/Views/Main/HistoricalWorkSubmissions.cshtml", workSubmissions);
}

HistoricalWorkSubmissions.cshtml:

 @model SWV.WorkPicture.UI.Models.HistoricalWorkSubmisssionViewModel

@{
    ViewBag.Title = "HistoricalSubmissions";
}

<h2>HistoricalSubmissions</h2>
@using (Html.BeginForm("HistoricalWorkSubmissions", "Main", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken();
    <fieldset>
        <div>
            <table class="table-bordered">
                @*@foreach (var submission in Model.Submissions)*@
                @for (int i=0; i < Model.Submissions.Count(); i++)
                {
                    var bmiWorks = Model.Submissions[i].Society + Model.Submissions[i].Rsa + "   " + Model.Submissions[i].ProcessingTime;
                    <tr>
                        <td>
                            @Html.CheckBoxFor(m => Model.Submissions[i].isSelected)
                            @Html.Label(bmiWorks)
                            @Html.HiddenFor(m => Model.Submissions[i])

                        </td>
                    </tr>
                }
            </table>
            <input class="button btn-primary" type="submit" value="Save"/>
        </div>
    </fieldset>
}

最后发布方法:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> HistoricalWorkSubmissions(HistoricalWorkSubmisssionViewModel workSubmissions)
{
    WorkSearchViewModel workSearchViewModel = new WorkSearchViewModel();
    workSearchViewModel.SwvId = "5124cfb4-afe8-4783-ab97-b9fbaaf6737d";

    var workPicturesx = await _swvManager.SearchAllWorkSubmissionsAsync(workSearchViewModel).ConfigureAwait(true);
           
    return View("~/Views/Main/HistoricalWorks.cshtml");
}

后-

abc 的值在调试器中为空。请帮忙。

【问题讨论】:

  • 尝试添加价值来自哪里? GetHistoricalRecordsAsync([FromForm] BmiAndAscapSubmisssions abc)
  • 在问题中向我们展示您的模型。
  • @derloopkat 我已经清理了代码并添加了模型。
  • @daremachine 我不明白。
  • @NKM 代替 foreach 使用 for,如下所示:stackoverflow.com/a/60361830/2516718

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


【解决方案1】:

确保帖子中的字段名称与模型匹配。标签不是问题,但CheckBoxForHiddenFor 会以发布到服务器的形式生成HTML input 标签。

@Html.CheckBoxFor(m => Model.Submissions[i].isSelected)
@Html.Label(bmiWorks)
@Html.HiddenFor(m => Model.Submissions[i].Society)
@Html.HiddenFor(m => Model.Submissions[i].Rsa)
@Html.HiddenFor(m => Model.Submissions[i].ProcessingTime)   

我还删除了 submission 的隐藏字段,因为它是模型中的一个对象,而我们需要为每个属性生成标签。

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多