从表单提交的空模型
empty model submitted from the form
我正在使用 Asp.Net Core 的最新预览版。我有一个页面,其中包含非常简单的编辑表单并显示了一些其他数据。
@model SeasonFullDetailsViewModel
.....
<form asp-action="Save">
<div class="form-horizontal">
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="SeasonId" />
<div class="form-group">
<label asp-for="Season" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Season" class="form-control" />
<span asp-validation-for="Season" class="text-danger" />
</div>
</div>
<div class="form-group">
<label asp-for="IsFinal" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="IsFinal" class="form-control" />
<span asp-validation-for="IsFinal" class="text-danger" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
</form>
问题是我无法将表单数据提交到模型中,只能作为单独的字段。
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Save(int seasonId, string season, bool isFinal)
{
// values are ok
return new EmptyResult();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Save(SeasonFullDetailsViewModel season)
{
// empty values inside season
return new EmptyResult();
}
我认为问题在于模型使用继承并且来自表单的数据包含在父 类 中。
public class SeasonFullDetailsViewModel : SeasonDetailsViewModel
{
// some data here
}
public class SeasonDetailsViewModel : SeasonBaseViewModel
{
public bool IsFinal { get; set; }
// also some other data
}
public class SeasonBaseViewModel
{
public int SeasonId { get; set; }
public string Season { get; set; }
// and some more data
}
我尝试过使用更简单的模型,但它也不起作用。
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Save(SeasonEditModel season)
{
// empty values inside season
return new EmptyResult();
}
public class SeasonEditModel
{
public int SeasonId { get; set; }
public string Season { get; set; }
public bool IsFinal { get; set; }
}
我知道我可以使用 Ajax 来发送数据或者只是从单独的字段创建所需的模型,但我想找出这里的问题是什么以及是否有办法克服它。为什么使用 SeasonEditModel 的解决方案不起作用?
此处已回答:asp.Net MVC view model is empty on post
按照惯例,您需要使用与视图模型名称相同的参数名称。你有:
public IActionResult Save(SeasonFullDetailsViewModel season)
如果您将参数名称更改为这样匹配,它应该可以工作:
public IActionResult Save(SeasonFullDetailsViewModel seasonFullDetailsViewModel)
我相信 Justin 的回答是正确的,但有一点不同:只有当您通过 HTML 表单 post 将数据发送到控制器操作时,模型变量命名约定才会发挥作用 post。
如果您通过手动构建自己的 post 数据结构而不是通过表单集合 post 将数据添加到操作中,情况就不一样了。
例如。一个 AJAX 电话。
我正在使用 Asp.Net Core 的最新预览版。我有一个页面,其中包含非常简单的编辑表单并显示了一些其他数据。
@model SeasonFullDetailsViewModel
.....
<form asp-action="Save">
<div class="form-horizontal">
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="SeasonId" />
<div class="form-group">
<label asp-for="Season" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Season" class="form-control" />
<span asp-validation-for="Season" class="text-danger" />
</div>
</div>
<div class="form-group">
<label asp-for="IsFinal" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="IsFinal" class="form-control" />
<span asp-validation-for="IsFinal" class="text-danger" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
</form>
问题是我无法将表单数据提交到模型中,只能作为单独的字段。
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Save(int seasonId, string season, bool isFinal)
{
// values are ok
return new EmptyResult();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Save(SeasonFullDetailsViewModel season)
{
// empty values inside season
return new EmptyResult();
}
我认为问题在于模型使用继承并且来自表单的数据包含在父 类 中。
public class SeasonFullDetailsViewModel : SeasonDetailsViewModel
{
// some data here
}
public class SeasonDetailsViewModel : SeasonBaseViewModel
{
public bool IsFinal { get; set; }
// also some other data
}
public class SeasonBaseViewModel
{
public int SeasonId { get; set; }
public string Season { get; set; }
// and some more data
}
我尝试过使用更简单的模型,但它也不起作用。
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Save(SeasonEditModel season)
{
// empty values inside season
return new EmptyResult();
}
public class SeasonEditModel
{
public int SeasonId { get; set; }
public string Season { get; set; }
public bool IsFinal { get; set; }
}
我知道我可以使用 Ajax 来发送数据或者只是从单独的字段创建所需的模型,但我想找出这里的问题是什么以及是否有办法克服它。为什么使用 SeasonEditModel 的解决方案不起作用?
此处已回答:asp.Net MVC view model is empty on post
按照惯例,您需要使用与视图模型名称相同的参数名称。你有:
public IActionResult Save(SeasonFullDetailsViewModel season)
如果您将参数名称更改为这样匹配,它应该可以工作:
public IActionResult Save(SeasonFullDetailsViewModel seasonFullDetailsViewModel)
我相信 Justin 的回答是正确的,但有一点不同:只有当您通过 HTML 表单 post 将数据发送到控制器操作时,模型变量命名约定才会发挥作用 post。
如果您通过手动构建自己的 post 数据结构而不是通过表单集合 post 将数据添加到操作中,情况就不一样了。
例如。一个 AJAX 电话。