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