Razor Pages - 由于多个对象共享参数,模型验证失败

我遇到了一个我似乎无法解决的问题。我正在使用 Razor Pages 并且有两个可以绑定的对象。


[BindProperty]

public MeetingMinuteInputDto MeetingToCreate { get; set; }


[BindProperty]

public MeetingMinuteUpdateDto MeetingToUpdate { get; set; }

以上两个是用于在我的数据库中创建/更新基本实体的单独 dto。我有两个单独的 dto,因为我只允许更新特定项目(以防止过度发布)。两个类都有Name,Date和Reminder. MeetingMinuteUpdateDto唯一允许Date更改的。


Name属性是必需的,不能为空。我在同一个页面/控制器中拥有两个对象的原因是因为我使用模式来创建/更新,我宁愿不创建多个页面只是为了创建/编辑对象。


我有两种用户可以填写的表格——一种用于编辑,另一种用于创建。每一个都将值绑定到一个特定的对象(即创建表单会将其发布的表单值绑定到MeetingMinuteInputDto)。


<div class="form-group">

    <div class="col-md-10">

          <label asp-for="MeetingToCreate.Name" class="control-label"></label>

          <input asp-for="MeetingToCreate.Name" class="form-control" />

          <span asp-validation-for="MeetingToCreate.Name" class="text-danger"></span>

      </div>

</div>

以上是我创建新会议的表单示例。我检查了提交表单时,只有MeetingMinuteInputDto值被绑定到。另一个对象 ( MeetingMinuteUpdateDto) 的所有属性都具有空值。


但是当我检查模型状态时,MVC 会在“名称”属性上抛出一个错误,说它为空。我查看了模型状态的结果,并且有一个名为“Name”的键,它与任何未通过验证的对象无关。


如果我从页面中删除另一个对象(即我删除MeetingMinuteUpdateDto)并进行模型绑定,则一切正常。如何防止模型验证尝试验证与当前操作无关的对象?我希望 Create 操作仅验证创建对象,反之亦然。


我试过这样做TryValidateModel(MeetingToCreate),但这也为模型验证提供了错误。

http://img1.mukewang.com/62ca8ae200017e4f06500184.jpg

注意:我不能只将对象属性放在外面,因为我有其他页面需要这样做,其中更新/创建对象有 10 多个共享/不共享的属性。


更新- 我可以手动从模型状态字典中删除验证错误。但我不太喜欢这种方法,因为我不想遍历所有不正确键的属性并删除它们。



一只萌萌小番薯
浏览 135回答 2
2回答

胡说叔叔

我正在做类似的事情。搜索任何解决方案,我找到你的问题,但不是我分享解决方案的解决方案。我实现了多个 BindProperty 和多个 Actions OnPost,我找到的解决方案是使用 [Bind] 属性在 Asp.Net MVC 中做一些事情。在你的情况下,它会。public class MeetingMinutesModel : PageModel{&nbsp; &nbsp; //[BindProperty] remove it&nbsp; &nbsp; public MeetingMinuteInputDto MeetingToCreate { get; set; }&nbsp; &nbsp; //[BindProperty] remove it&nbsp; &nbsp; public MeetingMinuteUpdateDto MeetingToUpdate { get; set; }&nbsp; &nbsp; //...stuff}public IActionResult OnPost([Bind("Name, FileToUpload, AdditionalInfo")] MeetingMinuteInputDto MeetingToCreate){&nbsp; &nbsp; //Do somthing}

慕工程0101907

在 Razor pages 中,页面中的 @model 是PageModel并且 class 的“Name”属性MeetingMinuteManipulationDto是Required,因此模型状态验证会验证 PageModel 中的所有属性。如果你坚持原来的想法,你可以尝试使用ViewComponent在同一个 razor 视图中实现创建/编辑对象。
打开App,查看更多内容
随时随地看视频慕课网APP