3

我有以下模型:

public class PersonListModel
{
   ....

    [Required(ErrorMessage=AppConstants.MustSelectRecordToAttachMessage)]
    public String SelectedPersonId { get; set; }
}

和以下观点:

@using (Html.BeginForm("Attach", "Person", FormMethod.Post, new { @id = attachRecordFormId, targetDivId = personListId, @class = "inlineForm" }))
{
    .....

    @Html.HiddenFor(x => x.SelectedPersonId);

    .....

   <br />@Html.ValidationMessageFor(x => x.SelectedPersonId)
}

隐藏的 SelectedPersonId 字段是通过一些连接到我页面上某个元素的 keyup 事件的 javascript 填充的。

我的问题是所需的验证消息会立即显示此部分视图,而不仅仅是在提交表单时。在通过 Ajax 帖子再次呈现部分视图后,它也会再次显示。

我有非常相似的观点没有表现出这个问题,但是有 2 个观点(包括上面的那个)确实表现出这个问题。我经历了一个排除过程,试图找出正常工作的视图和表现出这种不正确行为的 2 个视图之间有什么不同,但是我无法找到问题的原因。

我认为在加载问题视图时,某些东西会导致不显眼的验证触发。我怎样才能找到这个?

4

1 回答 1

3

我的问题是所需的验证消息立即显示此部分视图显示

如果显示视图(包含部分视图)的控制器操作将视图模型作为参数,则可能会发生这种情况:

public ActionResult Display(MyViewModel model)
{
    ... if this action is called with a GET request and you have missed
        to pass a value for the "SelectedPersonId" query string parameter 
        you will get a validation error in the corresponding view

    return View(model);
}

发生这种情况的原因是因为您的操作正在使用模型 => 默认模型绑定器正在尝试填充您的视图模型,并且当它尝试为SelectedPersonId属性设置值时,它会自动向模型状态添加验证错误如果请求中没有相应的值,因为您的模型属性被[Required]属性修饰。

在通过 Ajax 帖子再次呈现部分视图后,它也会再次显示。

这是正常的,如果目标 POST 操作将您的视图模型作为参数并呈现部分内容,则可能会发生这种情况:

[HttpPost]
public ActionResult Process(MyViewModel model)
{
    ... if this action is called with a POST request and you have missed
        to pass a value for the "SelectedPersonId" form parameter 
        you will get a validation error in the corresponding partial view

    return PartialView(model);
}
于 2013-01-09T21:54:52.917 回答