【问题标题】:How to handle Remote Attributes on Model Edit? ASP.Net MVC3如何处理模型编辑上的远程属性? ASP.Net MVC3
【发布时间】:2012-09-02 15:45:21
【问题描述】:

我在我的模型中使用远程属性来检查重复的页面标题,如下所示

public class Page
{
  [Remote("CheckDuplicate", "Page", ErrorMessage = "Title already taken")]
  public string Title { get; set; }
}

在控制器中,我根据“Check”结果返回 JsonResult 数据,如下所示:

public JsonResult CheckDuplicate(string Title)
{
   var result = db.Pages.Where(a => a.Title == Title).Count() == 0;
   return Json(result, JsonRequestBehavior.AllowGet);
}

这在 Create 操作中运行良好,但问题是,它限制我编辑现有页面,因为它正在检查相同的查询。

如何解决这个问题?请给我一些建议

【问题讨论】:

  • 我不确定我是否完全理解你的问题——你能详细说明一下吗?为什么您的编辑视图有问题?为什么对 Create 和 Edit 应用相同的远程验证会出现问题?
  • @Lasse Christiansen - sw_lasse:请参阅远程验证应用于模型属性 标题 因此,每当我对模型进行操作时,它都会检查此操作。
  • @Lasse Christiansen - sw_lasse 请参阅,在创建表单中检查重复标题(返回真/假),这没关系。但是在编辑中,如果我使用相同的标题进行更新,它会再次检查具有 "待编辑的标题" 的重复标题,并显示标题已被占用。这就是问题
  • 我明白了,谢谢 - 我现在发布了一个可能的解决方案 :)

标签: asp.net-mvc-3 model controller action remote-validation


【解决方案1】:

您的问题类似于:ASP.NET MVC 3 Remote validation to allow original value

我认为诀窍是在模型中将AdditionalFields 参数用于远程验证属性,并将其与视图中的隐藏字段结合起来——就像上面的 StackOverflow 帖子中所建议的那样。然后,您可以将“初始”值与新值一起发送到远程验证方法,并使用这两个参数进行唯一性检查。

可以在此处找到如何解决此问题的另一个示例:https://stackoverflow.com/a/4756796/700926

AdditionalFields 的文档可以在这里找到:http://msdn.microsoft.com/en-us/library/system.web.mvc.remoteattribute.additionalfields(v=vs.98).aspx

【讨论】:

  • 如果您不想将其用作隐藏字段,而是用作可编辑字段怎么办?
【解决方案2】:

我觉得应该是这样的

您必须在编辑页面中有一个隐藏字段为InitialUsernameUser 模型上的Remote 属性,AdditionalFields 包含InitialUsername

控制器

    [HttpPost]
    public JsonResult doesUserNameExist(string UserName,string InitialUsername)
    {
        User user=null;
        //Check if user already exists
        if (UserName.Equals(InitialUsername)==false)
        {
         user = db.Users.Where(u => u.USERNAME == UserName).FirstOrDefault();
        }
        //

        return Json(user == null);
    }

【讨论】:

    【解决方案3】:

    只需在要禁用远程验证的地方添加 Html 属性 喜欢

     @Html.EditorFor(model => model.CODE, 
                        new { 
                              htmlAttributes = new { 
                                                     @readOnly = true, 
                                                     @data_Val = false } })
    

    如果您存储了,还可以查看 HiddenField 值 会成功的

    【讨论】:

      【解决方案4】:

      我是通过以下步骤解决的: 在我看来,我把@Html.Hidden("InitialUserName", Model.UserName);

      在模型上放置:[Remote("IsUserNameUsed", "User", AdditionalFields="InitialUserName")]

      在Controller actionmethod中写actionmethod如下:

          public JsonResult IsUserNameUsed(string UserName, string InitialUserName){
          bool isExist = true;
          if(UserName  != string.empty && InitialUserName == "undefined"){
          var isexist= db.model.where( x=>x.UserName == UserName).single();
          if(isexist != string.empty){
          bool isExist = false;
          }
      
          if(UserName  != string.empty && InitialUserName != "undefined"){
          var isexist= db.model.where( x=>x.UserName == UserName && x.UserName != InitialUserName ).single();
          if(isexist != string.empty){
          bool isExist = false;
          }    
      return Json(isExist , JsonRequestBehavior.AllowGet);  
      }    
      }
      

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多