我正在尝试实现简单的CMS。我有Page
个类实例,我想将它们添加到数据库中,也可以编辑它们。
UrlName
中的Page
应该是唯一的,因此我制作了自定义验证器,但在编辑时我无法在不将UrlName
更改为不存在的情况下提交表单。如何将额外数据传递给我的VerifyUrl
,或者还有其他方法可以解决这个问题?
public class Page : IUpdatable<Page>
{
public int ID { get; set; }
[Required]
[DataType(DataType.Url)]
[Remote(action: "VerifyUrl", controller: "Pages")]
public string UrlName { get; set; }
}
这是PagesController
public JsonResult VerifyUrl(string UrlName)
{
if (!db.Pages.Any(x => x.UrlName.Equals(UrlName)) )
return Json(data: true);
return Json(data: "This Url is already in use");
}
这是我的观点
<input asp-for="UrlName" class="form-control" />
<span asp-validation-for="UrlName" class="text-danger" />
答案 0 :(得分:0)
在Remote ErrorMessage和Action Mehtod中指定“此URL已在使用中”,如果提供的URL已经是“使用”,则在Json中返回false。
模型类
[DisplayName("URL")]
[Required]
[Remote("Validate", "Home", HttpMethod = "Post", ErrorMessage = "This URL already exists")]
public string URL { get; set; }
在您的控制器中
[HttpPost]
public ActionResult Validate(string URL)
{
//Do validation here from DataBas
//if URL already exist, return false, else true;
return Json(false);
}
<强> Working Demo 强>
要将其他信息传递给控制器方法,可以将远程属性中的附加字段指定为:
[DisplayName("User name")]
[Required]
public string UserName { get; set; }
[DisplayName("URL")]
[Required]
[Remote("Validate", "Home", HttpMethod = "Post",AdditionalFields="UserName", ErrorMessage = "This URL and Username should not be same")]
public string URL { get; set; }
[HttpPost]
public ActionResult Validate(string URL, string UserName)
{
if(URL == UserName)
return Json(false);
else
return Json(true);
}
<强> Woking Demo for additional field 的强>
答案 1 :(得分:0)
您是否允许用户在编辑帖子时更改网址?如果不是,我会创建单独的视图模型,一个用于“新帖子”,另一个用于“编辑帖子”。
New Post View Model可以调用验证方法。编辑时,只要您不允许用户更改UI中的URL,您就不需要重新验证它。