ASP。在部分视图中进行MVC验证并返回到父视图

时间:2022-04-06 11:22:02

My Background

我的背景

I am working on first serious project using ASP.NET MVC 4. I am working on web development since classic ASP days and have got good hold on Webforms. MVC is very exciting and am doing good progress. But now I am in a situation where I need help on this forum.

我正在使用ASP进行第一个重要的项目。净MVC 4。从经典的ASP时代开始,我就一直致力于web开发,并且对web表单有了很好的了解。MVC非常令人兴奋,并且正在取得良好的进展。但现在我在这个论坛上需要帮助。

Query background

查询背景

I have a parent view and inside it there is a partial view. Partial view contains a form and submit button. The partial view has its own local view model and that view model is one of the properties of the Parent view model.

我有一个父视图,里面有一个部分视图。部分视图包含一个表单和提交按钮。局部视图有自己的局部视图模型,该视图模型是父视图模型的属性之一。

In case the validations on partial views fail, I want to, show the parent view as it is and highlight invalid fields in partial view.

如果部分视图的验证失败,我想要显示父视图,并突出部分视图中的无效字段。

The code is not breaking anywhere but when there is a validation error, somehow, i am not finding right way to show parent view with initialised model passed to it. And of course, to highlight the errors in partial view.

代码在任何地方都不会出错,但当出现验证错误时,不知何故,我无法找到正确的方式显示传递给它的初始化模型的父视图。当然,强调部分视图中的错误。

Any help would be appreciated. Thanks.

如有任何帮助,我们将不胜感激。谢谢。

Code looks like following:

代码看起来像:

View Models:

视图模型:

public class ParentViewModel
{
    public int TitleId { get; set; }
    public string Name { get; set; }
    public ChildViewModel Child { get; set; }
}

public class ChildViewModel
{
    [Required]
    public decimal Rating { get; set; }        

    [Required]
    [StringLength(500)]
    [Display(Description = "Review")]
    [RegularExpression("([a-zA-Z0-9 .&'-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")]
    public string ReviewText { get; set; }
}

Controller

控制器

public class TestController : Controller
{
    public ActionResult Index()
    {
        var model = new ParentViewModel()
                        {
                            TitleId = 1,Name = "Parent name",
                            Child = new ChildViewModel()
                                        {
                                            Rating = 2.5M, ReviewText = "Its a must watch!"
                                        }
                        };
        return View("Index", model);  
    }

    [HttpPost]
    public ActionResult SubmitReview(ChildViewModel model)
    {
        if (ModelState.IsValid )
        {
            return View("_child", model);
        }

        ModelState.AddModelError("", "Some Error.");
        return View("_child", model);
    }
}

Parent View

父视图

@model ParentViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
</head>
<body>
    <div>
        @Model.TitleId, @Model.Name        
    </div>
    <div>
        @Html.Partial("_child", Model.Child)
    </div>
</body>
</html>

Partial View (_child.cshtml)

局部视图(_child.cshtml)

@model ChildViewModel
@using (Html.BeginForm("SubmitReview", "Test"))
{
    @Html.ValidationSummary(true)

    @Html.TextBoxFor(m => m.Rating)     @Html.ValidationMessageFor(m => m.Rating)
    @Html.TextBoxFor(m => m.ReviewText) @Html.ValidationMessageFor(m => m.ReviewText)
    <input type="submit" value="Log in" />
}

1 个解决方案

#1


8  

You need to show the parent view not the child one, so the action should look like:

您需要显示父视图而不是子视图,因此操作应该如下:

[HttpPost]
    public ActionResult SubmitReview(ChildViewModel model)
    {
             var parentViewModel = write init code here;
            parentViewModel.ChildModel = model;

        if (ModelState.IsValid )
        {

            return View("Index", parentViewModel );
        }

        ModelState.AddModelError("", "Some Error.");
        return View("Index", parentViewModel );
    }

#1


8  

You need to show the parent view not the child one, so the action should look like:

您需要显示父视图而不是子视图,因此操作应该如下:

[HttpPost]
    public ActionResult SubmitReview(ChildViewModel model)
    {
             var parentViewModel = write init code here;
            parentViewModel.ChildModel = model;

        if (ModelState.IsValid )
        {

            return View("Index", parentViewModel );
        }

        ModelState.AddModelError("", "Some Error.");
        return View("Index", parentViewModel );
    }