2014-01-13 2 views
0

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

<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, который возвращается ложь, так как название места, в ModelState пусто. Мне действительно нужен Id для сохранения InventoryItem. Но я обязателен в поле «Название местоположения», потому что, когда я перехожу к разрешению добавления местоположений, я хочу, чтобы это поле было необходимо.

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

ответ

0

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

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

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

0

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

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

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

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

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

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