2015-03-21 4 views
0

Я поиск в базе данных двух значений:Почему моя модель заполняется, но текстовое поле нет?

public class SearchProjectModel : ISearchProject 
    { 
     public int ProjectID { get; set; } 
     [Display(Name = "Project Number")] 
     public string JobNumber { get; set; } 
     [Display(Name = "Project Name")] 
     public string JobName { get; set; } 
    } 

Индекс Вид:

@model SearchProjectModel 

@using (@Html.BeginForm("ManipulateProject", "Project", FormMethod.Post)) 
{ 

    <div> 
     @Html.HiddenFor(x => x.ProjectID) 
     <div class="col-md-3"> 
      @Html.LabelFor(x => x.JobNumber) 
      @Html.TextBoxFor(x => x.JobNumber, new { @class = "form-control", id = "jobNumber" }) 
      @Html.ValidationMessageFor(x => x.JobNumber) 
     </div> 
     <div class="col-md-6"> 
      @Html.LabelFor(x => x.JobName) 
      @Html.TextBoxFor(x => x.JobName, new { @class = "form-control " }) 
      @Html.ValidationMessageFor(x => x.JobName) 
     </div> 
    </div> 

    <div class="col-md-12 text-center" style="margin-top: 1%"> 
     <button type="submit" class="btn btn-primary">Submit</button> 
    </div> 
} 

На контроллере я затем создает новую модель, основанную от того, что было найдено:

public ActionResult ManipulateProject(SearchProjectRequest request) 
{ 
    var project = _projectService.GetBy(request); 
    if (project != null) 
    { 
     //When this method is complete the data is in the new model!!!! 
     return View("Project", Assemble(project)); 
    } 
    return View("Project", Assemble(new ManipulateProjectModel())); 
} 

Модель:

public class ManipulateProjectModel : IProject 
{ 
    public int ProjectID { get; set; } 
    [Display(Name = "Project Number"), Required(ErrorMessage = "Required!")] 
    public string JobNumber { get; set; } 
    [Display(Name = "Project Name"), Required(ErrorMessage = "Required!")] 
    public string JobName { get; set; } 
    //Lots of stuff that is being populated 
} 

Project Вид:

@model ManipulateProjectModel 

<div> 
@using (@Html.BeginForm("Save", "Project", FormMethod.Post)) 
{ 
    @Html.HiddenFor(x => x.ProjectID) 
    <div class="col-md-12" style="border: 1px dotted black; padding: 1%; margin-top: 1%"> 
     <h3 class="col-md-12 text-center">Project Info</h3> 
     <div class="col-md-3"> 
      @Html.LabelFor(x => x.JobNumber) 
      @Html.TextBoxFor(x => x.JobNumber, new { @class = "form-control", id = "jobNumber"}) 
      @Html.ValidationMessageFor(x => x.JobNumber) 
     </div> 
     <div class="col-md-6"> 
      @Html.LabelFor(x => x.JobName) 
      @Html.TextBoxFor(x => x.JobName, new { @class = "form-control "}) 
      @Html.ValidationMessageFor(x => x.JobName) 
     </div> 

     //stuff that is populated just fine 
    </div> 
} 
</div> 

Когда проект найден и сборка называется, новая модель заполняется со всеми данными !!! Но если бы я только искал один из двух параметров, то поле, которое я не заполнял, заполнено на модели, но текстовое поле не отображает данные.

Почему модель заполнена, но представление не заполняет текстовое поле. Он не должен знать и не заботиться о том, было ли заполнено предыдущее представление.

+2

Просьба указать код просмотра. –

+0

не могли бы вы высказать код своего вида. –

+0

@AnnL Обновлено по вашему запросу – Robert

ответ

0

Это потому, что помощники html используют значения от ModelState, а не значения от вашей модели. Когда вы отправляете сообщение public ActionResult ManipulateProject(SearchProjectModel request) (обратите внимание, что это действительно SearchProjectModel, а не SearchProjectRequest), создается экземпляр SearchProjectModel и его свойства связаны. Значения также добавляются к ModelState.

Когда вы возвращаете представление с экземпляром ManipulateProjectModel, ваш @Html.TextBoxFor(x => x.JobName) устанавливает значение, сначала ищет значение ModelState. Поскольку значение в первой форме было (скажем) null, тогда текстовое поле будет отображать пустую строку после сообщения, потому что значение ModelState для JobName равно null, несмотря на то, что вы, возможно, установили метод Assemble(). Причина такого поведения объясняется в this answer.

Один из вариантов - дать вашим SearchProjectModel свойствам других названий, что свойства в ManipulateProjectModel. Другой вариант, чтобы очистить ModelState перед тем переназначение новых значений и возвращает вид

ModelState.Clear(); // clears all values 
// or clear one property 
if (ModelState.ContainsKey("JobName")) 
{ 
    ModelState["JobName"].Errors.Clear(); 
} 

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

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