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

时间:2015-10-19 11:20:45

标签: c# asp.net-mvc razor multilingual

我正在使用ASP.NET MVC开发一个多语言Web应用程序。但有些语言是可选的。例如,用户在屏幕上看到两个文本框。其中一个用于英语,另一个用于法语。我想通过web.config动态创建文本框。如果" ActiveLanguageList"在web.config中有一个语言代码,因此应用程序为该语言创建一个文本框。但我无法从我的视图模型动态创建它。我必须手动编写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
 }

2 个答案:

答案 0 :(得分:1)

您可以创建一个属性,指定只有在web.config中定义时才能显示属性。

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

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

示例(没有html生成):https://dotnetfiddle.net/RRvC6K

答案 1 :(得分:1)

由于您要生成未知数量的文本框,因此您的模型需要是一个集合。您应该查看模型

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
}