0

我有一个部分视图可以在我的文章详细信息的主视图上为我的文章模块发表评论。用于评论的模型具有三个必填字段,ID(身份字段)ArticleIdCommentText。(我正在使用 Razor 语法)

我试图在行动中通过ArticleId控制器。Create

public ActionResult Create(ArticleComment articlecomment, string AID)
{

    articlecomment.ArticleId = AID;    //this is required

    if (User.Identity.IsAuthenticated)
    {
        articlecomment.UserId = WebSecurity.CurrentUserId.ToString();
    }
    else
    {
        articlecomment.UserId = Constants.Anonymus;
    }

    articlecomment.CommentDate = DateTime.Now;

    if (ModelState.IsValid)
    {
        db.ArticleComment.Add(articlecomment);
        int success = db.SaveChanges();
        if (success > 0)
        {
            return Content("<script language='javascript' type='text/javascript'>alert('Comment added successfully.');window.location.href='" + articlecomment.ArticleId + "';</script>");
        }
        else
        {
            return Content("<script language='javascript' type='text/javascript'>alert('Posting comment has failed, please try later.');window.location.href='" + articlecomment.ArticleId+ "';</script>");
        }
    }

    return PartialView(articlecomment);
}

但仍然ModelState.IsValid返回错误。我使用了以下代码,发现它ModelState变得ArticleId空了。

foreach (var modelStateValue in ViewData.ModelState.Values)
{
    foreach (var error in modelStateValue.Errors)
    {
        // Do something useful with these properties
        var errorMessage = error.ErrorMessage;
        var exception = error.Exception;
    }
}

我还考虑过设置ArticleId使用隐藏字段的值,ViewBag但没有找到任何工作代码。我试过以下:

@Html.HiddenFor(model => model.ArticleId, new { @value = ViewBag.Article })

 @Html.HiddenFor(model => model.ArticleId, (object)ViewBag.Article)

我发表评论的“ParticalView”是:

@model Outliner.Models.ArticleComment

<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)



        <div class="editor-label">
           @* @Html.HiddenFor(model => model.ArticleId, new { @value = ViewBag.Article })
            @Html.HiddenFor(model => model.ArticleId, (object)ViewBag.Article)*@
            @Html.LabelFor(model => model.Comment) &nbsp;&nbsp;&nbsp;
            <span class="error">@Html.ValidationMessageFor(model => model.Comment)</span>  
        </div>

            @Html.TextAreaFor(model => model.Comment)        

            <input type="submit" value="Post" />        

}

这就是我在“ArticalDetail”视图(我的主视图)上调用这个局部视图的方式:

 @Html.Action("Create", "ArticleComment")

我之前已经在控制器上为视图传递了必填字段值,但我面临 PartialView 的问题。我做错了什么,我怎样才能做到这一点?

尝试后编辑

当 Satpal 和 Fals 引导我找到一个方向时,我尝试了他们的建议,并尝试了以下操作:

TryUpdateModel(articlecomment);

并且

TryUpdateModel<ArticleComment>(articlecomment);

并且

TryValidateModel(articlecomment);

但我仍然收到相同的 ArticleId 验证错误,然后我签入 Watch 并且我尝试的所有树方法都返回False

我还尝试了以下操作:

UpdateModel(articlecomment);

UpdateModel<ArticleComment>(articlecomment);

上述方法正在生成异常:

无法更新“Outliner.Models.ArticleComment”类型的模型。

这是我的模型:

 [Table("ArticleComments")]
    public class ArticleComment
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        public string ArticleId { get; set; }

        public string UserId { get; set; }

        [Required]
        [Display(Name = "Comment")]
        public string Comment { get; set; }

        [Required]
        [Display(Name = "Commented On")]
        public DateTime CommentDate { get; set; }

    }

我不明白,为什么我的模型没有更新...... :(

4

4 回答 4

2

您可以在检查之前尝试TryUpdateModel(articlecomment)一次ModelState.IsValid。但是我还没有测试过

于 2013-10-23T16:56:07.390 回答
2

这是很晚的答案,但它应该工作。

之前ModelState.IsValid,添加以下内容

ModelState.Remove("ArticleId");

它将从验证中删除该字段。

于 2014-03-26T18:45:38.377 回答
1

在 ModelBind 之后更新任何 requerid 字段后,您必须调用另一个方法来更新验证。

您可以使用:

TryValidateModel(articlecomment);

或者

TryUpdateModel<ArticleComment>(articlecomment);
于 2013-10-23T16:59:02.017 回答
0

对我来说@Html.Action(...),就像您说的那样,您的代码似乎调用了创建局部视图的操作。如果您这样做,则不是调用局部视图的正确方法。虽然返回部分视图的操作并不少见,但根据我的经验,它通常是通过 AJAX 进行的,因此您可以在它返回后将其插入 DOM。

您可以使用以下方法来渲染局部视图:

@{ 
    Html.RenderPartial("_myPartialView", 
                       new ArticleComment {ArticleId = model.Id}); 
}

这应该渲染您的局部视图,将您的模型传递给它,以便它可以正确渲染。然后,当表单被 POST 到服务器时,它应该从表单数据创建模型。您不需要 AID 参数,因为它是ArticleComment模型的一部分。

于 2013-10-24T15:21:09.140 回答