我正在尝试按照最佳做法向我的用户界面添加数据验证。我想将数据验证添加到ViewModel,然后如果该数据有效,则将表单提交给控制器。但是,控制器接收的数据始终为空值。知道我做错了什么吗?整个MVVC架构令我困惑。当我使用模型提交表单时,我有工作但我无法在模型上获得数据验证?
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> CreateResource(AddResourceViewModel model)
{
if (ModelState.IsValid)
{
await (//does something);
}
return View();
}
模型视图:
public class AddResourceViewModel
{
public string User { get; set; }
public string ResourceName { get; set; }
public int ResourceId { get; set; }
public string Model { get; set; }
public float Latitude { get; set; }
public float Longitude { get; set; }
public decimal Amount { get; set; }
public int UnitId { get; set; }
public int PrimaryEsfId { get; set; }
public IEnumerable<string> Capabilities { get; set; }
public IEnumerable<int> AdditionalEsfs { get; set; }
public Resource Resource { get; set; }
}
cshtml表单的开头:
@model erms.ViewModel.AddResourceViewModel
<form asp-controller="AddResource" asp-action="NewResource" method="post" class="form-horizontal">
<div class="panel panel-default">
<div class="panel-body">
<form asp-controller="AddResource" asp-action="CreateResource" method="post" class="form-horizontal">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="ResourceId" class="col-md-2 control-label">Resource ID:</label>
<div class="col-md-10">
<input asp-for="ResourceId" class="form-control" value="@Model.Resource.ResourceId" readonly />
<span asp-validation-for="ResourceId" class="text-danger"></span>
</div>
</div>
答案 0 :(得分:2)
将return View();
替换为return View(model);
。
答案 1 :(得分:1)
这种东西让我在学习新建筑时感到非常沮丧,但我已经弄清楚了。这是一个命名约定问题。我已经解决了这个问题,现在它正在运作:
冲突的名字是:
public string Model { get; set; }
来自我的ViewModel,并且:
public async Task<IActionResult> NewResource(AddResourceViewModel model)
来自我的控制器。因此模型与模型 ...
冲突根据:http://ideasof.andersaberg.com/development/aspnet-mvc-4-model-binding-null-on-post
不要将Action中的传入变量命名为与发布模型中的相同。这会弄乱Model Binder。
答案 2 :(得分:0)
也许我认为问题是你没有使用剃须刀提交表格。这就是我的想法:
@model <AddResourceViewModel>
@using(Html.BeginForm()) {
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="ResourceId" class="col-md-2 control-label">Resource ID:</label>
<div class="col-md-10">
@Html.TextboxFor(x => x.ResourceId)
@Html.ValidationMessageFor(x => x.ResourceId)
</div>
</div>
}
由于这是我通常用来验证表单的内容,也许值得考虑。我可能错了。