我需要使用MVC生成动态表单 我计划在Controller的Action中创建HTML代码(基于数据库值)并将其作为Partialview传递给View。 要完成此任务,我需要在Action中创建一个动态视图。所以我可以在其中添加所有html代码并将其作为Partialview传递给视图 有没有办法做到这一点?
或者
在MVC中还有其他方法可以动态生成html元素吗?
答案 0 :(得分:0)
在该操作中,您可以返回动态创建的html
内容。只需使用Content()
作为风箱
return Content("<form><input value='"+valueFromDb+"'/>...</form>");
但这不是一个好习惯,所以你需要创建一个局部视图,然后使用
返回它//var modelFromDb=db.Table.FirstOrDefault();
return PartialView("MyPartial",modelFromDb);
编辑要为部分代码生成代码,您需要右键单击控制器操作,然后选择添加视图键入 MyPartial 作为视图命名,然后检查添加强类型视图 ...您需要精确模型类和要使用的模板(列表,删除,编辑,创建或清空)
答案 1 :(得分:0)
我不认为在控制器中生成代码是个好主意,事情会变得混乱。
如果要保存数据库中的字段,则必须针对每个字段保存类型。
示例:强>
Field Types Table
TypeId Name
1 TextBox
2 DropDown
Fields Table
FieldId TypeId (FK) IsEdit FormId (FK) Style
1 1 1 1 color: red
2 2 1 1 NULL
从数据库中读取时,您可以将这些转换为字段列表
public class Field
{
// Common Properties
public string Style {get;set;}
public int TypeId {get;set;}
public string Name {get;set;
}
然后对于DB中的每种类型,您可以创建一个类并从Field
派生public class DropDown : Field
{
public Dictionary<string, string> Values {get;set;}
}
public class TextBox : Field
{
public string Value {get;set;}
}
然后从数据库中读取每个通过Factory类
//从数据库读取
var model = new List<Field>();
var fields = dbContext.Fields.Where(s => s.FormId == 1);
foreach(var field in fields){
model.Add(FieldFactory(field));
}
//通过工厂
public Field FieldFactory(Form form){
switch(field.TypeId)
{
case 1: // Textbox --> you can use enum
return new TextBox(SET_VALUES);
}
}
然后创建一个部分视图,例如form.cshtml
,将字段列表作为模型传递
return PartialView("form", new List<Field>());
然后处理form.cshtml
@model List<Field>
@foreach(var field in Model){
switch(field.TypeId){
case 1: // TextBox
@Html.Partial("TextBox", (TextBox)field)
break;
case 2:
@Html.Partial("DropDown", (DropDown)field)
break;
}
}
为每种字段类型创建部分视图:
TextBox.cshtml:
@model TextBox
<input type ="text" name = "@Model.Name" stlye ="@Model.Style" value = "@Model.Value" />
DropDown.cshtml
@model DropDown
@Html.DropDownListFor(m => m.FieldId, new SelectList(Model.Values, "Value", "Key")
使用此方法,您可以将JavaScript和jQuery代码添加到每个字段PartialView。