gpt4 book ai didi

asp.net-mvc - 当参数名称需要不同时,如何重用远程验证方法?

转载 作者:行者123 更新时间:2023-12-04 20:21:52 24 4
gpt4 key购买 nike

我有两个类用作两个不同 View 的模型。您可以看到第二个类包含第一个类的实例。第一个包含远程验证属性。

[MetadataType( typeof( ExceptionLogModel.EmailRecipientMetadata ) )]
public class EmailRecipientViewModel
{
public int EmailRecipientID { get; set; }

[Remote( "ValidateEmailRecipientNameUniqueness", "EmailRecipient", ErrorMessage = "Name is not unique." )]
public string Name { get; set; }

[Remote( "ValidateEmailRecipientEmailUniqueness", "EmailRecipient", ErrorMessage = "Email is not unique." )]
public string Email { get; set; }
}

public class EmailRecipientChoices
{
public List<EmailRecipient> UnselectedEmailRecipients { get; set; }
public List<EmailRecipient> SelectedEmailRecipients { get; set; }
public EmailRecipientViewModel EmailRecipient { get; set; }
}

当这些验证在浏览器中触发时,会根据 View 使用的类发出两个不同的请求。可以看到查询字符串参数名称不同:
http://localhost:55327/EmailRecipient/ValidateEmailRecipientNameUniqueness?Name=sdhsdgh

http://localhost:55327/EmailRecipient/ValidateEmailRecipientNameUniqueness?EmailRecipient.Name=sdhsdgh

这是我的操作方法的当前版本,它不适用于第二个 URL:
public JsonResult ValidateEmailRecipientNameUniqueness( string name )
{
var isValid = !_emailRecipientRepo.NameExists( name );

return Json( isValid, JsonRequestBehavior.AllowGet );
}

当使用第二个 URL 时,name 参数将为空。我已经读过我应该能够向该参数添加一个 Bind 属性并添加一个前缀,但这也不起作用。我什至尝试将前缀设置为 EmailRecipient.以防万一它需要点。为了以防万一,我还尝试在名称中使用大写 N。不去。添加它也会破坏其他 URL!
public JsonResult ValidateEmailRecipientNameUniqueness( [Bind( Prefix = "EmailRecipient")] string name )

可能的解决方案

我可以让该方法获取一个 EmailRecipientViewModel 的实例并为其创建一个 IModelBinder,我可以在其中查找任一命名约定并将其分配给该实例。这似乎比应该做的工作更多。

我可以使用 @Html.EditorFor() 的重载并告诉它使用“名称”作为 htmlFieldName,同时使用 @Html.ValidationMessage( "Name" )而不是 ValidationMessageFor .唯一的缺点是潜在的命名冲突,但这并不是什么大不了的事。我只需要为正在使用的这个类的所有实例使用一个唯一的名称。 更新:实际上,如果我这样做,因为我更改了名称,所以在我发布表格时会破坏一些东西。那不好。

...

我刚刚发现我可以让该方法不带参数,并手动访问查询字符串。这是一个非常简单的解决方案,但我没有得到 nice 参数。
string name = Request.QueryString[ "Name" ] ?? Request.QueryString[ "EmailRecipient.Name" ];

这很容易,我可能只会使用它。但是,既然我已经输入了这个问题,我会问,有没有更优雅的解决方案?

最佳答案

好吧,我知道这已经很晚了,但是有一个更优雅的解决方案:

public JsonResult ValidateEmailRecipientNameUniqueness (EmailRecipient recipient)
{
string name = recipient.Name;
var isValid = !_emailRecipientRepo.NameExists(name);
return Json(isValid, JsonRequestBehavior.AllowGet);
}

换句话说,使用模型本身。它将正确绑定(bind) name属性,你只需要这个值。

关于asp.net-mvc - 当参数名称需要不同时,如何重用远程验证方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5655092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com