【问题标题】:ASP.NET MVC / If modelstate is invalid -> return a bootstrap alertASP.NET MVC / 如果模型状态无效 -> 返回引导警报
【发布时间】:2016-04-04 12:24:51
【问题描述】:

我的问题是:“如果模型状态无效,我如何显示警报?”

我有一个 HomeController,用于检查 ModelState.IsValid 是否存在。我正在使用模式来创建新项目。

// GET: Project/
    public ActionResult Index()
    {
        using (var service = new Service1Client())
        {
            ProjectDto newProject = new ProjectDto();
            newProject.StartTime = DateTime.Now;

            var details = service.GetAllRequirementDetails();
            var list = new SelectList(details, "Id", "Title");
            var projects = service.GetAllProjects().ToList();

            var vm = new ProjectIndexViewModel(list, newProject);
            vm.Projects = projects;

            return View(vm);
        }
    }

    // POST: Project/Create/
    [HttpPost]
    public ActionResult Index(CreateProjectViewModel vm)
    {
        if (ModelState.IsValid)
        {
            using (var service = new Service1Client())
            {
                service.CreateProject(vm.NewProject);
                return RedirectToAction(RedirectString);
            }
        }

        return RedirectToAction(RedirectString);
    }

我要添加

<div class="alert alert-danger" role="alert">
    <a href="#" class="alert-link">Something went wrong!</a>
</div>

【问题讨论】:

    标签: html asp.net asp.net-mvc twitter-bootstrap


    【解决方案1】:

    如果从同一方法返回,或者如果模型状态返回重定向到下一个方法,则使用 ViewBag,然后使用 TempData。

    这里是示例代码。

    // POST: Project/Create/
      [HttpPost]
      public ActionResult   Index(CreateProjectViewModel vm)
      {
         if (ModelState.IsValid)
          {
             using (var service = new Service1Client())
            {
                service.CreateProject(vm.NewProject);
                return  RedirectToAction(RedirectString);
            }
    
        }
          ViewBag.Message = "Something went wrong";//if it is redirecting to some other action then use TempData
        return  View(vm);
    }
    

    在视图部分

      @if(!string.isNotNullorEmpty(ViewBag.Message){
    
     <div class="alert alert-danger"  role="alert">
        <a href="#" class="alert-link">
        @ViewBag.Message</a>
        </div>
     }
    

    【讨论】:

      【解决方案2】:

      您可以使用将您的消息放在 else 部分,然后返回您的视图(使用已发布的模型)而不是重定向。我已经包含了一行,它有助于查看调试时出了什么问题。这样您就可以根据错误自定义消息。

      [HttpPost]
      public ActionResult Index(CreateProjectViewModel vm)
      {
          if (ModelState.IsValid)
          {
              using (var service = new Service1Client())
              {
                  service.CreateProject(vm.NewProject);
                  return RedirectToAction(RedirectString);
              }
          }
          else
          {
              ViewBag.error = "Something went wrong";
              var errors = ModelState.Values.SelectMany(x => x.Errors);
              return View(vm);
          }
      }
      

      在视图中:

      <div class="alert alert-danger" role="alert">
          <a href="#" class="alert-link">@ViewBag.error</a>
      </div>
      

      【讨论】:

      • 如果模型状态无效,我希望它显示出来。现在它一直都在那里。
      • 这取决于您如何制作 CSS。否则,您可以进行测试:@if (ViewBag.error != null) (就像在 Shyju 的回答中一样)
      • 谢谢!这非常简单而且很棒!
      【解决方案3】:

      如果您不是通过 ajax 发布表单,您可以做的是设置一个标志以指示验证失败,并在您的页面中检查该值并执行您的 js 代码以显示引导警报。

      如果ModelState.IsValid 为假,您不应该重定向,您应该将发布的模型返回到同一视图。

      [HttpPost]
      public ActionResult Index(CreateProjectViewModel vm)
      {
          if (ModelState.IsValid)
          {
              using (var service = new Service1Client())
              {
                  service.CreateProject(vm.NewProject);
                  return RedirectToAction(RedirectString);
              }
          }
          ViewBag.DidValidationFail="Yes";
          return View(vm);
      }
      

      在您的索引视图中,根据此标志的值呈现 div

      @if (ViewBag.DidValidationFail == "Yes")
      {
          <div class="alert alert-danger" id="errorMsg" role="alert">
              <a href="#" class="alert-link">Something went wrong!</a>
          </div>
      }
      

      如果您不喜欢使用动态ViewBag,您可以向视图模型添加一个属性并设置该属性值并在您的剃须刀中使用它(与我们对 ViewBag 项目所做的相同)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-08
        • 2010-12-07
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多