首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MVC5中使用表单发布数据时的无效模型状态

在MVC5中使用表单发布数据时的无效模型状态
EN

Stack Overflow用户
提问于 2016-06-28 11:00:31
回答 2查看 5.1K关注 0票数 0

我是全新的Asp.net MVC

我想填写一个表单并将其发布到数据库中,但是我的模型绑定验证是错误的。我在我的模型中的错误并没有显示出来

对不起,因为我不知道有什么问题,我不能缩短它:

这是我的模型:

代码语言:javascript
复制
public class Request
{
    //pkey
    public virtual int Id { get; set; }
    //Fkey
    public virtual int TourId { get; set; }

    [Required]
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string FirstName { get; set; }


    [Required]
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string LastName { get; set; }

    [Required]
    [EmailAddress(ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "Email")]
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string Email { get; set; }

    [Required]
    public virtual string Phone { get; set; }

    [MaxLength(100000000, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string Comment { get; set; }


    public virtual bool FrequentTraveler { get; set; }

    [Required]
    [Range(1, 500000)]
    public virtual int TravelersCount { get; set; }


    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
    public virtual string Date { get; set; }


    public virtual bool ContactTimePreference { get; set; }

    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")]
    public virtual string Country { get; set; }


    public virtual bool Archived { get; set; }

这就是我的观点:

代码语言:javascript
复制
@using (Html.BeginForm("Create", "Request"))
{
  <div class="form-group">
   <input  type="hidden" name="TourId" value="4"/>
  </div>

 <div class="form-group">
 @Html.EditorFor(model => model.Request.FirstName, new { htmlAttributes = new { @class = "form-control" } })
 @Html.ValidationMessageFor(model => model.Request.FirstName, "", new { @class = "text-danger" , placeholder = "FirstName" })

 </div>



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


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

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


 <div class="form-group ft">
 @Html.EditorFor(model => model.Request.FrequentTraveler)
 @Html.ValidationMessageFor(model => model.Request.FrequentTraveler, "", new { @class = "text-danger" })
    </div>


<div class="form-group">
   <input type="hidden" name="TravelersCount" value="3" />
</div>

  <div class="form-group">
    <input type="hidden" name="TravelersCount" value="3" />
  </div>



}

我省略了它们允许为空的一些表单组。

这是我在请求控制器中创建的操作:

代码语言:javascript
复制
 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "Id,TourId,FirstName,LastName,Email,Phone,Comment,FrequentTraveler,TravelersCount,Date,ContactTimePreference,Country,Archived")] Request request)
    {
        if (ModelState.IsValid)
        {
            db.Requests.Add(request);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View();
    }

如果有人告诉我使我的请求对象为valid.and有什么问题,如果可能的话,当用户将null放在服务器所需的名字中时,应该如何向用户发送错误,我对此表示感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-29 06:01:31

ModelState将无效,因为您的视图正在为模型生成表单控件,该模型与您在POST方法中所期望的模型不同。例如

代码语言:javascript
复制
@Html.EditorFor(model => model.Request.FirstName, ...)

正在产生

代码语言:javascript
复制
<input type="text" name="Request.FirstName" .... />

但是POST方法中的模型是Request,它没有一个名为Request的属性--它只有一个名为FirstName,因此绑定失败,ModelState由于[Required]验证属性而无效。

为了绑定到Request模型,html需要

代码语言:javascript
复制
<input type="text" name="FirstName" .... />

此外,您的[Bind]属性也排除了正确绑定的值,因为它确实包含"Request"

删除[Bind]属性(您似乎希望绑定所有默认的内容),或者更改POST方法中的模型以匹配视图中声明的模型,或者使用BindAttributePrefix属性

代码语言:javascript
复制
public ActionResult Create([Bind(Prefix= "Request")] Request model)

最后,删除隐藏输入的手动html,并使用@Html.HiddenFor(m => m.Request.TourId)等,这样名称属性是一致的,并且将正确绑定。

最后,我建议您阅读What is ViewModel in MVC?。在视图中使用数据模型,特别是在编辑表单时。

附带注意:您可以在POST方法中使用以下查询来轻松检查模型中存在验证错误的属性

代码语言:javascript
复制
var errors = ModelState.Keys.Where(k => ModelState[k].Errors.Count > 0).Select(k => new
{
    propertyName = k,
    errorMessage = ModelState[k].Errors[0].ErrorMessage
});
票数 2
EN

Stack Overflow用户

发布于 2016-06-28 11:43:45

您不应该使用与模型名称相同的名称作为参数,这将在返回的过程中中断绑定过程。尝试将签名从

public ActionResult Create(Request request)

public ActionResult Create(Request req)

要检查ModelState错误,请使用以下代码:

代码语言:javascript
复制
foreach (ModelState modelState in ViewData.ModelState.Values)
{
 foreach (ModelError error in modelState.Errors)
 {
    var xx = error.ErrorMessage;
 }
}

如果在var xx上放置一个断点,您将看到错误是什么,但我很确定这是因为由于您使用的名称没有正确的绑定(实际上,我将完全更改其他东西的名称请求,但这只是我)。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38074381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档