Отображение поля только для чтения в ASP.NET Core

Я новичок в ASP.NET Core и хотел бы спросить об отображении поля в представлении w. у меня есть

class Person { 
    public string Name {get; set;} 
    public string Nickname {get; set;} 
}

Обычно в представлении EditPerson я делаю

<input asp-for="Name" class="form-control" />
<input asp-for="Nickname" class="form-control" />

для отображения полей.

Но в моем представлении EditPerson мне нужно отображать Name только для чтения и Nickname как редактируемое поле.

Name не должен находиться в текстовом поле (даже только для чтения), а скорее в метке или div...

Есть ли стандартный подход для отображения таких полей?

Я не хочу, чтобы поле обновлялось до модели или БД, мне нужно только прочитать поле.


person serge    schedule 23.08.2017    source источник


Ответы (8)


Выведите его как HTML с синтаксисом Razor

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/razor

@Model.Name
<input asp-for="Nickname" class="form-control" />

Примечание. Это потребует соответствующего стиля или обертывания тегом <span> и т. д.

person Alex    schedule 23.08.2017
comment
Я боюсь, что метка будет отображать отображаемое имя поля, а не значение поля, не так ли? - person serge; 23.08.2017
comment
Это должно быть @Model.Name - person ; 23.08.2017

Попробуй это.

<input asp-for="Name" class="form-control" readonly="@(true)">
<input asp-for="Name" class="form-control" readonly="@(false)">

Этот рендер:

<input class="form-control" type="text" id="Name" name="Name" value="Tom" readonly="readonly">
<input class="form-control" type="text" id="Name" name="Name" value="Tom">

Я понял это отсюда: https://github.com/aspnet/Mvc/issues/7333#issuecomment-363504164

person tsu1980    schedule 07.03.2018
comment
хороший момент, но прочитайте OP Имя не должно быть в текстовом поле (даже только для чтения) - person serge; 07.03.2018

Это сработало для меня

<input asp-for="Name" class="form-control" ReadOnly="true"/>
<input asp-for="Nickname" class="form-control" />
person Musab    schedule 23.08.2017
comment
Это отобразит значение в текстовом поле. В ОП указано The Name should not be in a textbox - person Alex; 23.08.2017
comment
также я не хочу, чтобы поле обновлялось до модели - person serge; 23.08.2017
comment
Поле не будет обновляться, оно просто сделает текстовое поле доступным только для чтения. - person Musab; 23.08.2017
comment
Второй будет генерировать не значение свойства, а метку для него (имя свойства или DisplayName, если указано). P.S: Что касается первого: кроме того, если вы вручную подделаете значение ввода (и, в конечном итоге, удалите атрибут только для чтения), модель будет обновлена, поэтому это небезопасно, если вы не проверили ее специально на стороне сервера. - person Samuil Petrov; 23.08.2017
comment
@SamuilPetrov более того, метка по умолчанию доступна только для чтения :) - person serge; 23.08.2017
comment
@СамуилПетров согласился - person Musab; 23.08.2017

[ReadOnly(true)]
public string Name {get; set;} 

Добавьте атрибут Только для чтения. Не забудьте включить using System.Component; в начало класса.

person Satish Rathore    schedule 23.08.2017
comment
Это не имеет абсолютно никакого отношения к тому, как отображается разметка. - person Alex; 23.08.2017

Если вы хотите отобразить свойство модели Name и не хотите, чтобы оно было элементом input, просто сделайте следующее:

<p>@Model.Name</p>

Важно: если вы использовали атрибут DisplayFormat для Name в своей модели (например, для применения форматирования чисел/дат или для управления отображением пробелов/пустых значений), вы должны сделать следующее:

<p>@Html.DisplayFor(m => m.Name)</p>

Конечно, это не обязательно должен быть p. Используйте div, span и т. д.

Дайте ему класс и стилизуйте его с помощью CSS по желанию.

person MarredCheese    schedule 11.09.2020

Это сработало для меня:

<input asp-for="Name" class="form-control" readonly="readonly" />
person user2341923    schedule 20.09.2019

Вы можете попробовать это:

<input asp-for="Name" readonly="@(!string.IsNullOrEmpty(Model.Name))" />
<input asp-for="Nickname" />

Используя здесь любое пользовательское условие, просто заставьте его возвращать true или false. readonly="@(!string.IsNullOrEmpty(Model.Name))"

person vanthong98    schedule 01.12.2020

Попробуй это:

<label class="form-control">@Model.Name</label>
person Mahmoud Ibrahim    schedule 23.08.2017