【问题标题】:MVC 4. ModelState.IsValid always return trueMVC 4. ModelState.IsValid 总是返回 true
【发布时间】:2013-06-28 16:45:05
【问题描述】:

我不明白为什么 ModelState.isValid 会以各种方式给我。我在电子邮件中设置了一些返回 true 并且我输入了空字段,它也返回 true。我的问题是,当我写电子邮件时该字段为空且没有任何内容时,我必须做什么才能返回 true?

我有下一个视图文件:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <div style="padding-top:5px;clear:both;"></div>
    <% using (Html.BeginForm()) { %>
        <%: Html.ValidationSummary(true) %>   
        <fieldset>
                <legend>Email usuario</legend>

                <div class="editor-field">
                    <%: Html.TextBoxFor(m => m.Email) %>
                    <%: Html.ValidationMessageFor(m => m.Email) %>
                </div>

                <input type="submit" value="Enviar Email" />
        </fieldset>
    <% } %>
    <div style="padding-top:5px;clear:both;"></div>
</asp:Content>

控制器是:

//
// GET: /Account/EmailRequest
public ActionResult EmailRequest()
{
    return View();
}

[HttpPost]
public ActionResult EmailRequest(string email)
{
    if (ModelState.IsValid)
    {
        // save to db, for instance
        return RedirectToAction("AnotherAction");
    }
    return View();
}

我的模型类是:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Globalization;
    using System.Web.Mvc;
    using System.Web.Security;

namespace PortalClient.Models
{
    public class EmailRequest
    {

        [Required(ErrorMessage = "required")]
        public string Email { get; set; }
    }
}

【问题讨论】:

  • 如果您将发布操作的签名从string email 更改为EmailRequest model,然后检查状态,您会看到什么结果?
  • [HttpPost] public ActionResult EmailRequest(EmailRequest email) { if (ModelState.IsValid) { // 保存到数据库,例如 return RedirectToAction("AnotherAction"); } 返回视图(); }
  • 你建议我的函数我从字符串更改为 EmailRequest,它返回 null
  • 好的,我得到了最后一条评论的解决方案,我必须在 EmailRequest 中添加模型。现在它正在工作。谢谢。
  • 我添加了我的评论作为解决方案,如果它解决了您的问题。

标签: c# asp.net-mvc asp.net-mvc-4 modelstate


【解决方案1】:

将您的帖子操作的签名从string email 更改为EmailRequest model,然后检查状态。例如

[HttpPost]
public ActionResult EmailRequest(EmailRequest model)
{
    if (ModelState.IsValid)
    {
        // save to db, for instance
        return RedirectToAction("AnotherAction");
    }
    return View();
}

【讨论】:

  • 从遥远的未来开始,感谢您的回答。巧妙地解决了我的难题。
【解决方案2】:

您需要将视图模型绑定到您的视图。

将您的 EmailRequest 模型更改为更具描述性的内容,例如:

public class EmailRequestViewModel
{
     [Required(ErrorMessage = "Required")]
     public string Email { get; set; }
}

您的 get 操作方法如下所示:

public ActionResult EmailRequest()
{
     EmailRequestViewModel viewModel = new EmailRequestViewModel();

     return View(viewModel);
}

您的发布操作方法:

public ActionResult EmailRequest(EmailRequestViewModel viewModel)
{
     // Check for null view model

     if (!ModelState.IsValid)
     {
          return View(viewModel);
     }

     // Do whatever you need to do

     return RedirectToAction("List");
}

然后是你的观点。请原谅 ASP.NET MVC 4 代码,MVC 2 是史前的 :) 这只是你观点的一部分:

@model YourProject.ViewModels.EmailRequestViewModel

@using (Html.BeginForm())
{
     @Html.TextBoxFor(x => x.Email)
     @Html.ValidationMessageFor(x => x.Email)
}

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    您需要先将您的模型与 binder 绑定,才能通过 Modelstat.IsValid 对其进行检查

        public ActionResult EmailRequest()
        {
               EmailRequest email = new EmailRequest();
               TryUpdateModel(email);
            if (ModelState.IsValid)
            {
                // save to db, for instance
                return RedirectToAction("AnotherAction");
            }
            return View();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2012-11-02
      • 2013-02-26
      • 2011-02-22
      • 1970-01-01
      • 2013-08-06
      • 2017-05-10
      相关资源
      最近更新 更多