我有一个部分视图可以在我的文章详细信息的主视图上为我的文章模块发表评论。用于评论的模型具有三个必填字段,ID
(身份字段)ArticleId
和CommentText
。(我正在使用 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)
<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; }
}
我不明白,为什么我的模型没有更新...... :(