我想创建表单,但是稍后通过js填充它,而不是通过服务器渲染时的asp.net填充。
是否可以仅使用类元数据创建没有模型对象的表单?
例如:当我为字段创建编辑器时,我使用像@Html.EditorFor(contact => contact.FirstName)
这样的代码来尝试访问FirstName
属性,如果没有模型@Html.Partial("EditModal", (Contact)null)
,它将抛出异常说法
“传入字典的模型项目类型为'System.Collections.Generic.List'1 [Contact]',但此字典需要”Contact“类型的模型项。”
答案 0 :(得分:2)
您获得的错误与使用HtmlHelper
方法无关。之所以会发生这种情况是因为您的EditModal
部分有一个@model Contact
声明并且您使用@Html.Partial()
调用它而未传递Contact
的实例,因此默认情况下它会传递主模型查看女巫是List<Contact>
- 他们不一样,因此错误。有关更多说明,请参阅The model item passed into the dictionary is of type .. but this dictionary requires a model item of type。
HtmlHelper
方法不需要模型,因为它们使用ModelMetadata
生成表单控件的html属性(并将使用模型默认值生成value
属性模型是null
)。
您只需使用@Html.Partial("EditModal", new Contact())
传递模型的默认实例即可修复错误。从评论中,不清楚为什么你特别不想这样做(它的良好实践并且没有可衡量的性能影响)。但作为替代方法,您可以使用@Html.Action()
生成对话框/表单。在控制器中创建一个方法,比如说
[ChildActionOnly]
public PartialViewResult EditModal()
{
return View(); // not passing a model
}
并在主视图中,使用(假设该方法在同一个Controller中)
@Html.Action("EditModal") // or @{ Html.RenderAction("EditModal"); }
渲染部分而不传递模型。
但是使用return view(new Contact());
仍然是一种很好的做法,这样你就可以将新模型实例传递给视图(以后在尝试追踪错误时会让你感到痛苦,例如有人添加说{部分中的{1}}将抛出<div>@Model.SomeProperty</div>
)。
答案 1 :(得分:1)
只需使用普通的HTML
<input type="text" name="FirstName" id="FirstName" />
<script> myFunction(); function myFunction() { document.getElementById("FirstName").value = "Johnny Bravo";
<input type="text" name="FirstName" id="FirstName" /> </script>
答案 2 :(得分:1)
你可以使用绑定框架,一个例子是knockoutjs,所以你将使用Editor而不是EditorFor