通过Web.Config动态生成视图参数
问题描述:
我正在开发一个带有ASP.NET MVC的多语言Web应用程序。但有些语言是可选的。例如,用户在屏幕上看到两个文本框。其中一个用于英语,另一个用于法语。我想通过web.config动态创建文本框。如果web.config中的“ActiveLanguageList”具有语言代码,则应用程序会为该语言创建一个文本框。但我无法从我的视图模型动态创建它。我必须手动编写HTML帮助程序。我想用循环等动态创建它们......因为HTML页面中的国家代码是不同的。例如“ContentNameEn”,“ContentNameFr” 感谢您的建议。通过Web.Config动态生成视图参数
//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
}
答
因为你有数目不详的文本框的产生,你的模型需要的集合。您查看的模型应该是
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);
,然后你的看法是
@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" ... />
}
,并在POST方法
public ActionResult Edit(List<ContentVM> model)
{
// loop through the collection to get each ContentName and the associated LanguageCode
}
答
您可以创建一个属性,指定只有在web.config中定义属性时才必须显示该属性。
在所有“ContentName”属性上设置此属性。
使用反射来恢复包含此属性的所有模型属性。对于每个属性,检查相关代码是否存在于web.config中,并生成相应的html文本框。
例(不包括HTML代):https://dotnetfiddle.net/RRvC6K
你是说,你总是有'ContentNameEn'和一个文本框'ContentNameFr'但那么你可能有其他人说德语,西班牙语等? –
我是说。一种语言是必需的。但其他语言可以是可选的。如果ActiveLangs有“EN,FR,GR”,则有三个文本框。如果它有一种语言,则有一个文本框。如果它有10种语言,所以我需要10个文本框。 ContentNameEn,ContentNameFr,ContentNameSpa,ContentNameGer等... – Yargicx
然后你真的需要一个视图模型来表示这个,这样你就可以得到2路模型绑定 - 它将包含属性'string LanguageCode'和'string ContentName',然后你创建一个收集在视图中使用的视图模型并使用'for'循环来生成控件(包括用于语言代码的隐藏输入) –