传递给我的控制器时,ViewModel数据全为空?

时间:2016-11-13 01:25:54

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

我正在尝试按照最佳做法向我的用户界面添加数据验证。我想将数据验证添加到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>

3 个答案:

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

由于这是我通常用来验证表单的内容,也许值得考虑。我可能错了。