C# 验证消息不存在';不在viewmodel中将模型显示为属性

C# 验证消息不存在';不在viewmodel中将模型显示为属性,c#,asp.net-mvc,C#,Asp.net Mvc,我一直在努力处理asp.net中的模型验证消息 我有一个viewmodel使用的模型。 如果用户未填写必填字段,我希望视图显示验证错误 当必填字段未填充(预期行为)但我看不到时,My ModelState.IsValid为false 有错误消息吗 我的模型课: public class Model { [Required(ErrorMessage = "Name is required.")] public string Name { get; set; }

我一直在努力处理asp.net中的模型验证消息

我有一个viewmodel使用的模型。 如果用户未填写必填字段,我希望视图显示验证错误

当必填字段未填充(预期行为)但我看不到时,My ModelState.IsValid为false 有错误消息吗

我的模型课:

public class Model
{
        [Required(ErrorMessage = "Name is required.")]
        public string Name { get; set; }

        [Required(ErrorMessage = "Adress is required.")]
        public string Adress { get; set; }
}
我的ViewModel类:

public class ViewModel
{
        [Required]
        public Model SelectedModel { get; set; }

        public string Title { get; set;}
}
我的控制器:

        [HttpPost]
        public ActionResult Create(ViewModel vm)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    bool result = *DatabaseStuff*
                    if(result == true)
                    {
                        return RedirectToAction("Index");
                    }
                    else
                    {
                        return View();
                    }
                }
                return RedirectToAction("Index",vm);
            }
            catch
            {
                return View();
            }
        }
我的看法

@model ViewModel

@using (Html.BeginForm("Create", "MyController", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <div class="box box-primary">
        <div class="box-header with-border">
            <h4 class="box-title">ViewModel Form</h4>
        </div>
        <div class="box-body">
        <div class="row">
            <div class="col-md-12">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label" })
                @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.SelectedModel.Name, htmlAttributes: new { @class = "control-label" })
                @Html.EditorFor(model => model.SelectedModel.Name, null, "SelectedModel_Name",new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.SelectedModel.Name, "", new { @class = "text-danger", @data_valmsg_for = "SelectedModel_Name" })
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.SelectedModel.Adress, htmlAttributes: new { @class = "control-label" })
                @Html.EditorFor(model => model.SelectedModel.Adress, null, "SelectedModel_Adress",new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.SelectedModel.Adress, "", new { @class = "text-danger", @data_valmsg_for = "SelectedModel_Adress" })
        </div>

    </div>
    </div>
    </div>
        <div class="form-group">
            <div class="box-footer">
                <input type="submit" value="Create" class="btn btn-success pull-right" />
            </div>
        </div>

    </div>

}
@model视图模型
@使用(Html.BeginForm(“Create”,“MyController”,FormMethod.Post))
{
@Html.AntiForgeryToken()
视图模型窗体
@Html.ValidationSummary(true,“,new{@class=“text danger”})
@LabelFor(model=>model.Title,htmlAttributes:new{@class=“control label”})
@EditorFor(model=>model.Title,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Title,“,new{@class=“text danger”})
@LabelFor(model=>model.SelectedModel.Name,htmlAttributes:new{@class=“controllabel”})
@EditorFor(model=>model.SelectedModel.Name,null,“SelectedModel_Name”,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.SelectedModel.Name,”,new{@class=“text danger”,@data\u valmsg\u for=“SelectedModel\u Name”})
@LabelFor(model=>model.SelectedModel.address,htmlAttributes:new{@class=“control label”})
@EditorFor(model=>model.SelectedModel.address,null,“SelectedModel_-address”,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.SelectedModel.address,”,new{@class=“text danger”,@data\u valmsg\u for=“SelectedModel\u address”})
}

谢谢。

我认为当ModelState无效时,您应该返回View

  • 返回视图不会发出新的请求,它只是呈现视图 不更改浏览器地址栏中的URL

  • Return RedirectToAction在浏览器的 地址栏由MVC用生成的URL更新

        try
        {
            if (ModelState.IsValid)
            {
                bool result = *DatabaseStuff*
                if(result == true)
                {
                    return RedirectToAction("Index");
                }
                else
                {
                    return View();
                }
            }
            return View();
        }
    

我认为您不应该使用RedirectToAction,而应该只返回当前模型的视图。就像你的捕获一样。而且我认为模型验证在默认情况下不是嵌套的。它只适用于第一视图模型。RedirectToAction不会更改任何内容,因为我正在对其他模型使用它,并且在需要时会显示验证消息。当名称或地址字段ModelState.IsValid==false时,ModelValidation工作正常。我们可以查看ModelStateDictionnary,它实际上包含错误。@daremachine您在返回视图方面是对的。但奇怪的是,redirectToAction显示模型的验证消息,而不是ViewModel中的模型。它解决了我的问题,也许我仍然不明白为什么在使用模型时显示redirectToAction验证消息,而在ViewModel中使用模型时不显示验证消息。