假设我有一个表单,可以在运行时使用JavaScript创建新的文本输入。我想将值绑定到NameValueCollection(或Dictionary)。 ASP.NET MVC3本身是否允许这样做?
假设这是HTML表单......
<!-- if someone posted this form -->
<form action="MyExample">
<input type="hidden" name="id" value="123" />
<input type="text" name="things.abc" value="blah" />
<input type="text" name="things.def" value="happy" />
<input type="text" name="things.ghi" value="pelicans" />
<input type="submit" />
</form>
...这就是控制器中的“动作”......
public ActionResult MyExample(int id, NameValueCollection things)
{
// At this point, `things["abc"]` should equal `"blah"`
return Content(string.Format("Things has {0} values.", things.Count));
}
我是否需要制作自己的自定义模型装订器?或者我只是错误地命名输入框?
答案 0 :(得分:1)
我不认为默认的ASP.NET MVC3模型绑定器会这样做,所以我做了以下帮助器类。它工作正常,如果DefaultModelBinder已经处理它,我只是不想这样做。
我暂时不会将此标记为答案,希望有人能告诉我如何在没有自定义课程的情况下正常工作。但是对于那些有相同需求的人来说,这就是代码。
// Add this line in the Application_Start() method in the Global.asax.cs
ModelBinders.Binders.DefaultBinder = new NameValueAwareModelBinder();
using System.Collections.Specialized;
using System.Web.Mvc;
namespace Lil_Timmys_Example.Helpers
{
public class NameValueAwareModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelMetadata.ModelType == typeof(NameValueCollection))
{
var result = new NameValueCollection();
string prefix = bindingContext.ModelName + ".";
var queryString = controllerContext.HttpContext.Request.QueryString;
foreach (var key in queryString.AllKeys)
{
if (key.StartsWith(prefix))
{
result[key.Substring(prefix.Length)] = queryString.Get(key);
}
}
var form = controllerContext.HttpContext.Request.Form;
foreach (var key in form.AllKeys)
{
if (key.StartsWith(prefix))
{
result[key.Substring(prefix.Length)] = form.Get(key);
}
}
return result;
}
else
{
return base.BindModel(controllerContext, bindingContext);
}
}
}
}