【问题标题】:ASP.NET MVC Validation in Partial View and return to Parent view部分视图中的 ASP.NET MVC 验证并返回父视图
【发布时间】:2013-09-05 10:31:05
【问题描述】:

我的背景

我正在使用 ASP.NET MVC 4 进行第一个严肃的项目。我从经典的 ASP 时代就开始从事 Web 开发,并且很好地掌握了 Webforms。 MVC 非常令人兴奋,并且进展顺利。但是现在我在这个论坛上需要帮助。

查询背景

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

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

代码没有在任何地方中断,但是当出现验证错误时,不知何故,我找不到正确的方法来显示传递给它的初始化模型的父视图。当然,要突出显示局部视图中的错误。

任何帮助将不胜感激。谢谢。

代码如下所示:

查看模型:

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; }
}

控制器

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);
    }
}

父视图

@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>

部分视图 (_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" />
}

【问题讨论】:

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


    【解决方案1】:

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

    [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 );
        }
    

    【讨论】:

    • 这很有意义。但是有什么办法可以避免在提交时再次初始化父模型?现在我正在尝试将父模型传递给 SubmitReview,但父模型不记得这些值。但是感谢您的建议,我会实现它,因为它会起作用。
    • 在提交时,我应该如何获取父母的钥匙来初始化它?我希望我有点道理.....
    • 您可以将表单移动到父视图(这实际上是一个很好的做法),然后将父模型添加到隐藏字段中,这样当您单击提交时,您将在控制器中获得完整数据跨度>
    • 非常感谢。我正试图找到解决这个问题的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多