通过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 
} 
+0

你是说,你总是有'ContentNameEn'和一个文本框'ContentNameFr'但那么你可能有其他人说德语,西班牙语等? –

+0

我是说。一种语言是必需的。但其他语言可以是可选的。如果ActiveLangs有“EN,FR,GR”,则有三个文本框。如果它有一种语言,则有一个文本框。如果它有10种语言,所以我需要10个文本框。 ContentNameEn,ContentNameFr,ContentNameSpa,ContentNameGer等... – Yargicx

+1

然后你真的需要一个视图模型来表示这个,这样你就可以得到2路模型绑定 - 它将包含属性'string LanguageCode'和'string ContentName',然后你创建一个收集在视图中使用的视图模型并使用'for'循环来生成控件(包括用于语言代码的隐藏输入) –

因为你有数目不详的文本框的产生,你的模型需要的集合。您查看的模型应该是

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