Как сделать текстовое поле доступным только для чтения для определенного действия MVC?

Название может сбивать с толку, поэтому вот моя проблема: я бы хотел, чтобы в моем представлении было текстовое поле только для чтения, только если мое действие предназначено для редактирования (что-то вроде EditLocation), и если мое действие предназначено для добавления новой записи (AddLocation), я хотел бы редактируемое текстовое поле.

Мой фф. код работает, но мне было интересно, есть ли "более чистое" решение

@using (Html.BeginForm(Model.Location.Id == 0 ? "AddLocation" : "EditLocation", "Location"))
    {
        <fieldset>
            @Html.HiddenFor(x => x.Location.Id)
            @Html.HiddenFor(x => x.Location.CompanyGroupId)
            @Html.HiddenFor(x => x.CompanyGroup.Id)
            @Html.HiddenFor(x => x.CompanyGroup.Code)

            <div class="form-group">
                <strong><span>@ResourcesCommon.Location_Code</span></strong>
                @if (Model.Location.Id == 0)
                {
                    @Html.TextBoxFor(x => x.Location.Code, new { @class = "form-control" })
                    @Html.ValidationMessageFor(x => x.Location.Code)
                }
                else
                {
                    @Html.TextBoxFor(x => x.Location.Code, new { @class = "form-control", @readonly = "readonly" })
                    @Html.ValidationMessageFor(x => x.Location.Code)
                }

            </div> ...

Спасибо и удачной недели впереди!


person Caloyski    schedule 22.02.2016    source источник
comment
Одним из вариантов может быть создание собственных методов расширения HtmlHelper (см. этот ответ в качестве примера), но на самом деле вы должны использовать 2 представления (и использовать частичные для общего HTML)   -  person    schedule 22.02.2016
comment
Я полностью согласен с созданием двух отдельных представлений, но владелец приложения хочет иметь одно представление для повторного использования.   -  person Caloyski    schedule 22.02.2016
comment
Серьезно? Это кошмар обслуживания, и его трудно отлаживать. Если они хотят повторного использования, используйте частичные части для общих частей представлений.   -  person    schedule 22.02.2016
comment
Я согласен, проголосовал за ваш комментарий :D   -  person Caloyski    schedule 24.02.2016


Ответы (2)


Это может помочь вам:

@Html.TextBoxFor(x => x.Location.Code, new Dictionary<string, object>() .AddIf(true, "@class", "form-control") .AddIf(Model.Location.Id != 0, "@readonly", "readonly"))

// This returns the dictionary so that you can "fluently" add values
    public static IDictionary<TKey, TValue> AddIf<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, bool addIt, TKey key, TValue value)
    {
        if (addIt)
            dictionary.Add(key, value);
        return dictionary;
    }

Я взял это из другого поста stackoverflow давно, на который у меня нет ссылки.

person ManojAnavatti    schedule 22.02.2016
comment
Это интересно, попробуем. - person Caloyski; 24.02.2016
comment
Если вы нашли это интересным; если это было полезно, и если вы найдете это как более чистое решение, не забудьте принять ответ :) - person ManojAnavatti; 25.02.2016

Вы можете сделать что-то вроде этого (но это приведет к большему количеству кода):

@Html.TextBoxFor(x => x.Location.Code, new { @class = "form-control", @id="myInput" })

а затем добавьте несколько js:

$(document).ready(function() {
    $('#myInput').attr('readonly', @Html.Raw(Model.Location.Id != 0? "true" : "false"));
});
person Nemanja Todorovic    schedule 22.02.2016