为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
一只萌萌小番薯 2022-07-10 16:16:06
我遇到了一个我似乎无法解决的问题。我正在使用 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),但这也为模型验证提供了错误。注意:我不能只将对象属性放在外面,因为我有其他页面需要这样做,其中更新/创建对象有 10 多个共享/不共享的属性。更新- 我可以手动从模型状态字典中删除验证错误。但我不太喜欢这种方法,因为我不想遍历所有不正确键的属性并删除它们。
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我正在做类似的事情。搜索任何解决方案,我找到你的问题,但不是我分享解决方案的解决方案。


我实现了多个 BindProperty 和多个 Actions OnPost,我找到的解决方案是使用 [Bind] 属性在 Asp.Net MVC 中做一些事情。


在你的情况下,它会。


public class MeetingMinutesModel : PageModel

{

    //[BindProperty] remove it

    public MeetingMinuteInputDto MeetingToCreate { get; set; }


    //[BindProperty] remove it

    public MeetingMinuteUpdateDto MeetingToUpdate { get; set; }

    //...stuff

}


public IActionResult OnPost([Bind("Name, FileToUpload, AdditionalInfo")] MeetingMinuteInputDto MeetingToCreate)

{

    //Do somthing

}


查看完整回答
反对 回复 2022-07-10
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

在 Razor pages 中,页面中的 @model 是PageModel并且 class 的“Name”属性MeetingMinuteManipulationDtoRequired,因此模型状态验证会验证 PageModel 中的所有属性。如果你坚持原来的想法,你可以尝试使用ViewComponent在同一个 razor 视图中实现创建/编辑对象。



查看完整回答
反对 回复 2022-07-10
  • 2 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号