2015-10-19 4 views
2

Я разрабатываю многоязычное веб-приложение с ASP.NET MVC. Но некоторые языки будут необязательными. Например, пользователи видят два текстовых поля на экране. Один из них для английского и другого для французского. Я хочу динамически создавать текстовые поля с помощью web.config. Если «ActiveLanguageList» в web.config имеет код языка, чтобы приложение создало текстовое поле для этого языка. Но я не могу создать его динамически из моей модели представления. Я должен написать 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

Я имею в виду это. Требуется один язык. Но другие languges могут быть необязательными. Если ActiveLangs имеет «EN, FR, GR», имеется текстовое поле три. если у него один язык, есть одно текстовое поле. если у него 10 языков, поэтому мне нужно 10 текстовых полей. ContentNameEn, ContentNameFr, ContentNameSpa, ContentNameGer и т. Д. – Yargicx

+1

Тогда вам действительно нужна модель представления, чтобы представить это, чтобы вы могли получить привязку с двумя способами - она ​​будет содержать свойства 'string LanguageCode' и' string ContentName', а затем вы создаете сбор модели просмотра для использования в представлении и использование цикла 'for' для создания элементов управления (включая скрытый ввод для кода языка) –

ответ

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 
} 
1

Вы можете создать атрибут, который указывает, что свойство должно отображаться только в том случае, если оно определено в web.config.

Установите этот атрибут во все ваши свойства «ContentName».

Используйте отражение, чтобы восстановить все ваши свойства модели, которые содержат этот атрибут. Для каждого свойства проверьте, присутствует ли связанный код в файле web.config, и сгенерируйте соответствующее текстовое поле html.

Пример (без генерации HTML): https://dotnetfiddle.net/RRvC6K

Смежные вопросы