mvc.net如何编辑成员列表变量

时间:2010-09-14 17:04:53

标签: asp.net-mvc generics

鉴于以下模型具有名称,网址和任意关键字列表(我希望用户添加一系列关键字)...

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"

然后我根据表单集创建一个Picture对象。

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

[HttpPost]
public ActionResult Edit(Picture p)

但是在这种方法中,我的p.keywords属性始终为空。有没有办法帮助框架在我的控制器的操作方法之前重新创建我的p.keywords属性?

4 个答案:

答案 0 :(得分:1)

我认为编辑模板可能在这里工作,但我认为没有办法模拟绑定嵌套的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);

答案 1 :(得分:0)

您的关键字是否与文本框分开?如果是这样,创建这样的输入,它们将由模型绑定器填充。

<input name="keywords[0]" type="text">
<input name="keywords[1]" type="text">
<input name="keywords[2]" type="text">

答案 2 :(得分:0)

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

然后我连接到表单提交事件(使用jQuery)并附加输入以形成csv字符串,然后将其存储在隐藏输入中。这个隐藏的输入强烈地输入到我的模型上的属性。

它有点笨重,但是如果你有一个动态数量的可能的关键字,那么这很有效(除非当然禁用JS)

答案 3 :(得分:0)

您希望用户以何种方式添加更多关键字?用逗号分隔值(CSV)或动态添加文本框?

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