2012-01-02 12 views
12

У меня есть проект жерех MVC 3 Когда я используюПри использовании Html.TextBoxFor, добавьте название модели в качестве префикса идентификатор

@Html.TextBoxFor(model => model.Name) 

TexBoxFor делают, как

<input id="Name" name="Name" type="text" value="" /> 

моя модель «UserModel»:

[DisplayName("Name")] 
public string Name{ get; set; } 

есть ли способ, чтобы добавить к названию модели как префикс в ид? возможно, какой-то атрибут?

Я хочу, что текстовое поле будет отображаться как

<input id="UserName" name="UserName" type="text" value="" /> 
+4

Если вы хотите, чтобы она вызывалась UserName в представлении, почему бы не назвать его UserName в модели? –

+0

I второй комментарий Ойвинда, почему есть свойство, называемое «Name», украшенным атрибутом, который заставляет «Name», но вы хотите, чтобы он отображался как «UserName»? Кажется странным для меня. – enorl76

+0

это возможность изменить имя свойства, но если есть способ добавить атрибут для всех html hrlpers, значит, это было намного лучше и проще. – Kobi

ответ

-2

Вы можете написать:

@Html.TextBoxFor(model => model.Name, new { @id= "UserName",@Name="UserName" }) 
+0

ваш код по-прежнему будет генерировать атрибут 'name' как ** Name **. Таким образом, это не то, что он хочет. – tugberk

+0

Это не проблема. Он может написать: @ Html.TextBoxFor (model => model.Name, new {@id = "UserName", @ Name = "UserName"}) – Hadas

+2

Это совершенно неправильно! Вы не можете переопределить атрибут name при работе с html-помощниками, такими как TextBoxFor. BTW, FYI, вам не нужен '@' escape char. Вы используете '@' escape-символ со специальными ключевыми словами C#, такими как 'class'. – tugberk

2

Помощник TextBoxFor использует лямбда-выражение, которое передается в качестве первого аргумента для расчета на имя поле ввода. Так что если вы хотите, генерируемое поле ввода, чтобы называться UserName, просто переименовать свойство в модели вида:

[DisplayName("Name")] 
public string UserName { get; set; } 
0

Вы должны изменить атрибут DisplayName от «Name» на «UserName».

[DisplayName("UserName")] 
public string Name{ get; set; } 

Если вы это сделаете, вы получите то, о чем просите.

+1

Не будет работать. Имя свойства будет именем текстового поля. – gdoron

3

Если вы не хотите отображать ввод, как описано в вашей модели, вы, вероятно, не хотите использовать вспомогательный помощник Html.TextBoxFor.

Попробуйте Html.TextBox вместо этого. Вы можете предоставить его с точными значениями, которые вы ищете:

@Html.TextBox("UserName", Model.Name, new { id = "UserName" }) 

Не забывайте, что вы также можете забыть хелпер и использовать обычный старый HTML:

<input id="UserName" name="UserName" type="text" value="@Model.Name" /> 

Предупреждения: При использовании любой из этих методов и связующее устройство по умолчанию, значение этого ввода не будет возвращено к вашей модели правильно при отправке данных.

+0

Не могли бы вы немного объяснить часть предупреждения? Поля формы еще не сохранены при обратной передаче в MVC? –

+2

Значения привязаны к моделям на основе входных имен. Поэтому в этом случае модельное связующее не знает, что значение из входа «UserName» соответствует значению «Name» на модели. – enoshixi

11
@Html.TextBoxFor(model => model.attr, new { Name = "txt1" }) 

Просто используйте «Имя» вместо «имени»

+2

-1: Это приведет к двум атрибутам, называемым name: Name = "txt1" и name = "attr". Он работает в Firefox, поскольку браузер игнорирует второй атрибут name. Но это эссенциально батч. –

+1

WOW, я пытался переопределить имя в атрибутах html и не работал из-за имени в нижнем регистре. Спасибо. – DeadlyChambers

0

Если я понял ваш вопрос правильно, вы хотите, чтобы иметь возможность в качестве префикса строки на имя свойства модели.

Поэтому, если вы находитесь в представлении «счета», вы получите

AccountName 

в то время как с точки зрения «Test», вы получите

TestName 

Если это так, то я думаю, что вам лучше всего будет переопределение метода расширения PartialFor, аналогично тому, как это сделано здесь:

ASP.NET MVC partial views: input name prefixes

В этом примере, он будет оказывать

Account.Name and Test.Name 

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

  • Нет связанных вопросов^_^