C# 通过Web.Config参数动态生成视图

C# 通过Web.Config参数动态生成视图,c#,asp.net-mvc,razor,multilingual,C#,Asp.net Mvc,Razor,Multilingual,我正在用ASP.NETMVC开发一个多语言web应用程序。但有些语言是可选的。例如,用户在屏幕上看到两个文本框。其中一个是英语,另一个是法语。我想通过web.config动态创建文本框。如果web.config中的“ActiveLanguageList”具有语言代码,则应用程序将为该语言创建一个文本框。但我无法从视图模型动态创建它。我必须手动编写HTML助手。我想用循环等方式动态创建它们。。。因为一个不同的东西是HTML页面中的国家代码。例如“ContentNameEn”、“ContentNam

我正在用ASP.NETMVC开发一个多语言web应用程序。但有些语言是可选的。例如,用户在屏幕上看到两个文本框。其中一个是英语,另一个是法语。我想通过web.config动态创建文本框。如果web.config中的“ActiveLanguageList”具有语言代码,则应用程序将为该语言创建一个文本框。但我无法从视图模型动态创建它。我必须手动编写HTML助手。我想用循环等方式动态创建它们。。。因为一个不同的东西是HTML页面中的国家代码。例如“ContentNameEn”、“ContentNameFr” 谢谢你的建议

//in my setting class
var ActiveLangs = new List<string>(); //For example EN,FR

//in web.config
<add key="Languages" value="EN,FR"/>

//in my view model
[DisplayName("English Content Name")]
public string ContentNameEn { get; set; }

[DisplayName("French Content Name")]
public string ContentNameFr { get; set; }


//in myview
<div class="form-group">
    <label class="control-label col-md-2" for="ContentName">Content Name(EN)</label>
    <div class="col-md-4">
        @Html.TextBoxFor(model => model.ContentNameEn, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ContentNameEn)
    </div>
</div>

<div class="form-group">
    <label class="control-label col-md-2" for="ContentName">Content Name(FR)</label>
    <div class="col-md-4">
        @Html.TextBoxFor(model => model.ContentNameFr, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ContentNameFr)
    </div>
</div>

 //i want to code in the view like this but i can't
 @foreach(var langCode in ActiveLangs){
   //i need here create langCode's html code with htmlhelper
   //@Html.TextBoxFor
   //@Html.LabelFor
 }
//在我的设置类中
var ActiveLangs=新列表()//例如EN,FR
//在web.config中
//在我看来,这个模型
[显示名称(“英文内容名称”)]
公共字符串ContentNameEn{get;set;}
[显示名称(“法语内容名称”)]
公共字符串ContentNameFr{get;set;}
//在我看来
内容名称(英文)
@Html.TextBoxFor(model=>model.ContentNameEn,新的{@class=“form control”})
@Html.ValidationMessageFor(model=>model.ContentNameEn)
内容名称(FR)
@Html.TextBoxFor(model=>model.ContentNameFr,新的{@class=“formcontrol”})
@Html.ValidationMessageFor(model=>model.ContentNameFr)
//我想像这样在视图中编码,但我不能
@foreach(ActiveLangs中的var langCode){
//我需要在这里用htmlhelper创建langCode的html代码
//@Html.TextBoxFor
//@Html.LabelFor
}

您可以创建一个属性,该属性指定只有在web.config中定义的情况下才能显示属性

在所有“ContentName”属性上设置此属性

使用反射恢复包含此属性的所有模型属性。对于每个属性,检查web.config中是否存在关联的代码,并生成相应的html文本框


示例(不生成html):

因为要生成的文本框数量未知,所以模型需要是一个集合。您的视图模型应该是

public class ContentVM
{
  public string LanguageCode { get; set; }
  public string LanguageName { get; set; } // used for the label
  [Required]
  public string ContentName { get; set; }
}
然后在控制器中,创建一个集合。请注意,您在
Web.Config
中存储代码的方法可能需要更改,以允许您同时存储语言名称(xml文件可能是更好的解决方案)。比如说

List<ContentVM> model = new List<ContentVM>();
foreach (var language in ...)
{
  model.Add(new ContentVM(){ LanguageCode = language.Code, LanguageName = language.Name };
}
return View(model);
列表模型=新列表();
foreach(var语言在…)
{
Add(newcontentvm(){LanguageCode=language.Code,LanguageName=language.Name};
}
返回视图(模型);
然后你会看到

@model List<ContentVM>
....
@using (Html.BeginForm())
{
  for(int i = 0; i < Model.Count; i++)
  {
    @Html.HiddenFor(m => m[i].LanguageCode)
    @Html.LabelFor(m => m[i].ContentName, Model[i].LanguageName)
    @Html.TextBoxFor(m => m[i].ContentName)
    @Html.ValidationMessageFor(m => m[i].ContentName)
  }
  <input type=submit" ... />
}
@型号列表
....
@使用(Html.BeginForm())
{
for(int i=0;im[i].LanguageCode)
@Html.LabelFor(m=>m[i].ContentName,Model[i].LanguageName)
@Html.TextBoxFor(m=>m[i].ContentName)
@Html.ValidationMessageFor(m=>m[i].ContentName)
}

你是说你总是有一个用于
ContentNameEn
ContentNameFr
的文本框,但是你可能有其他的文本框,比如德语、西班牙语等?我的意思是。一种语言是必需的。但是其他语言可以是可选的。如果ActiveLangs有“EN、FR、GR”有三个E文本框。如果它有一种语言,就有一个文本框。如果它有10种语言,那么我需要10个文本框。ContentNameEn、ContentNameFr、ContentNameSpa、ContentNameGer等等。然后你真的需要一个视图模型来表示它,这样你就可以得到双向模型绑定-它将包含属性
字符串语言code
>字符串ContentName
,然后创建视图模型的集合以在视图中使用,并使用
for
循环生成控件(包括语言代码的隐藏输入)
public ActionResult Edit(List<ContentVM> model)
{
  // loop through the collection to get each ContentName and the associated LanguageCode
}