ASP.NET MVC /如果modelstate无效 - >返回引导警报

时间:2015-12-30 14:02:06

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

我的问题是:"如果模型状态无效,我怎样才能显示警告?"

我有一个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>

3 个答案:

答案 0 :(得分:2)

如果从同一方法返回,或者如果模型状态返回重定向到next方法,则使用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>
 }

答案 1 :(得分:0)

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

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

[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,则可以向viewmodel添加属性并设置该属性值并在剃刀中使用该属性(与我们对ViewBag项目的操作相同)

答案 2 :(得分:0)

您可以使用将您的消息放入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>