我正在尝试构建一个动态视图,我可以在其中传递需要由用户填写的属性列表。
属性集合是动态的,因此我无法构建显示特定属性的视图。
我已经能够显示属性名称及其初始值,并且用户可以更改屏幕上的值,但这些更新的值不会影响更新模型的控制器操作。
我尝试过使用动态模型,以及键/值对列表。
我认为它与过度保护有关。由于属性是动态的,我无法在更新操作的Bind属性中列出它们。
这是控制器动作方法:
public IActionResult Test()
{
dynamic testObj = new ExpandoObject();
testObj.IntProperty = 100;
testObj.StringProperty = "A String Value";
return View(testObj);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Test(ExpandoObject model)
{
return Ok();
}
以下是观点:
@model dynamic
@{
ViewData["Title"] = "Test";
}
<form asp-action="Test" method="post">
<div class="form-horizontal">
@foreach (var propertyName in ((System.Collections.Generic.IDictionary<string, object>)Model).Keys)
{
<div class="form-group">
<label class="col-md-2 control-label">@propertyName</label>
<div class="col-md-10">
@Html.TextBox(propertyName, ((System.Collections.Generic.IDictionary<string, object>)Model)[propertyName])
</div>
</div>
}
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
</form>
这是一个新的应用程序,我正在以代码优先 - 所以模型可以稍微改变。我真正需要做的就是能够拥有可以更新的不同属性。
提前致谢。
答案 0 :(得分:2)
我建议您完全不依赖于IModelBinder
以及为什么我建议这是因为在控制器和视图之间传递的表单数据在结构方面是动态的。一个更好但更麻烦的解决方案是直接从HttpContext.Request.Form
获取表单数据。此类型具有一个索引器,允许您按名称访问已发布的值。例如
var name = HttpContext.Request.Form["name"].FirstOrDefault();
.FirstOrDefault()
(或SingleOrDefault()
,当查找超过满足集合中条件的值时抛出异常)被调用,假设存在&#34;名称&#34;单值(或符合条件的单个值)输入。但是,当您有一个数组时,可以在foreach
循环中,或使用linq方法,或直接通过索引获取值。例如:
var name = HttpContext.Request.Form["name"].FirstOrDefault(x=> x.ToString().StartsWith("x"));
var name = HttpContext.Request.Form["name"][0];