代码之家  ›  专栏  ›  技术社区  ›  yamspog

MVC.NET如何编辑成员列表变量

  •  2
  • yamspog  · 技术社区  · 15 年前

    给定以下模型,该模型具有名称、URL和任意关键字列表(我希望用户添加一系列关键字)…

    public class Picture
    {
      public Picture()
      {
        keywords = new List<string>();
      }
      public string name {get;set:}
      public string url {get;set;}
      public List<string> keywords{get;set;}
    }
    

    …在我的控制器中执行以下操作…

    [HttpPost]
    public ActionResult Edit(FormCollection fc)
    {
      if (ModelState.IsValid)
      {
        // do stuff
      }
      return View(ModelManager.Picture);
    }
    

    在FormCollection中,我有以下字段

    fc["keywords"] = "keyword1,keyword2,keyword3"
    

    然后我基于表单集合创建一个图片对象。

    但是,我更喜欢使用强类型的操作,例如

    [HttpPost]
    public ActionResult Edit(Picture p)
    

    但是在这种方法中,我的p.keywords属性总是空的。是否有某种方法可以帮助框架在命中控制器的操作方法之前重新创建p.keywords属性?

    4 回复  |  直到 15 年前
        1
  •  1
  •   David Fox    15 年前

    我认为编辑器模板可以在这里工作,但我认为没有一种方法可以对嵌套的IEnumerable视图模型成员进行建模绑定。您最快的赌注可能是直接用formcollection和一些字符串解析魔术来处理它。否则,如果必须强类型化,如果可以控制关键字元素ID,这样的自定义模型绑定器可能会有所帮助:

    public class PictureKeywordBinder : IModelBinder
    {
        public object GetValue(ControllerContext controllerContext,
            string modelName, Type modelType,
            ModelStateDictionary modelState)
        {
            Picture picture = new Picture();
            //set name, url, other paramaters here
    
            foreach(var item in Request.Form.Keys)
            {
                if (item.StartsWith("keyword"))
                {
                    picture.keywords.Add(Request.Form[item]);
                }
            }
    
            //add any errors to model here
    
            return picture;
        }
    }
    

    也许可以在从父视图传递子模型的部分视图中设置关键字ID:

    <% Html.RenderPartial("PictureKeywords", Model.keywords);
    
        2
  •  0
  •   amarsuperstar    15 年前

    你的关键词是分开的文本框吗?如果是这样,那么创建一个这样的输入,它们将由模型绑定器填充。

    <input name="keywords[0]" type="text">
    <input name="keywords[1]" type="text">
    <input name="keywords[2]" type="text">
    
        3
  •  0
  •   Alastair Pitts    15 年前

    我解决这个问题的方法是使用隐藏的输入来存储项目的csv字符串,在您的例子中是关键字。

    然后我钩住表单提交事件(使用jquery)并附加输入以形成csv字符串,然后将其存储在隐藏的输入中。此隐藏输入被强类型化为我的模型上的属性。

    这有点笨拙,但是如果你有一个动态数量的可能关键字,那么这就可以很好地工作(当然,如果JS被禁用的话除外)。

        4
  •  0
  •   Siva Gopal    15 年前

    您希望用户以何种方式添加更多关键字?以逗号分隔值(csv)的形式还是通过动态添加文本框?

    根据你的要求,我有两个解决方案。