ModelState.IsValid для ненужного имени поля

У меня очень простая модель. У меня есть место с двумя полями: Id и Name. У меня есть InventoryItems, в котором есть несколько скалярных полей с FK для места, в котором он хранится. У меня есть представление для создания InventoryItem. В представлении есть раскрывающийся список для `

<div class="editor-label">
    @Html.LabelFor(model => model.Location)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.Location.Id, new SelectList(ViewBag.Locations, "Id", "Name"))
</div>

Код контроллера проверяет ModelState.IsValid, который возвращает false, потому что ИМЯ местоположения в ModelState пусто. Мне действительно нужен только идентификатор, чтобы сохранить InventoryItem. Но у меня есть [обязательно] в поле Location Name, потому что, когда я перехожу к разрешению добавления Locations, я хочу, чтобы это поле было обязательным.

Может ли кто-нибудь сказать мне ПРАВИЛЬНЫЙ способ справиться с этим в шаблоне проектирования MVC?


person user2919960    schedule 13.01.2014    source источник


Ответы (2)


Что ж, если имя уже установлено до этого момента, вы можете просто использовать @ Html.HiddenFor (), чтобы скрыть имя на странице, в которой сохраняется значение для HttpPost.

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

Лично я бы использовал View Models всякий раз, когда у вас меняются требования к валидации.

person DevotedSniper    schedule 13.01.2014

Лучший способ сделать это - использовать ViewModel, у которого есть только те поля, которые вам нужны на стороне пользовательского интерфейса, а затем преобразовать в вашу фактическую модель в контроллере.

В вашем случае вы можете использовать LocationLink в своем представлении / форме, которое принимает только идентификатор, например:

public class LocationLink
{
    [Required(ErrorMessage = "No id provided")]
    public string Id { get; set; }
}

Затем в вашем контроллере вы загружаете соответствующий Location из своего хранилища данных с предоставленным идентификатором и добавляете его в родительскую модель.

Обычно у вас должна быть ViewModel для отображения со всеми полями (Location с идентификатором и именем) и ViewModel для создания / редактирования форм (LocationLink в этом случае только с идентификатором).

person Karhgath    schedule 13.01.2014