鉴于以下模型具有名称,网址和任意关键字列表(我希望用户添加一系列关键字)...
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属性?
答案 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)或动态添加文本框?
根据您的要求,我有两个解决方案。