1

У меня есть частичный вид, где я визуализую, если пользователь выбрал опцию, кнопку, которая позволяет пользователю автоматически генерировать значение для определенного поля. Пожалуйста, дайте взглянуть на эту картину, чтобы понять, что я имею в виду:Почему моя кнопка не отображается?

alt text

Это достигается с помощью следующей разметки на частичный вид

<%= Html.LabelFor(model => model.IssueCode)%> 
<br /> 
<% if (Model.HasCodeGenerator) { %> 
    <%= Html.TextBoxFor(model => model.IssueCode, new { style = "width:120px;background-color:#eeeeee;border: solid 2px #dfdfdf", @readonly = "readonly" })%> 
    <% if (Model.ModelState == ModelStateEnum.Add) { %> 
     <button id="codeGenerator" style="font-size: 0.7em;margin-right: 10px">Genera codice fascicolo</button> 
    <% } %> 
<% } else { %> 
    <%= Html.TextBoxFor(model => model.IssueCode, new { style="width: 120px" })%> 
<% } %> 
<%= Html.ValidationMessageFor(model => model.IssueCode, "*")%> 

Как вы можете видеть, я добавляю всегда в Html. ValidationMessageFor() в конце поля ввода и AuthenticationSummary - конец представления.

Когда пользователь отправляет форму первый блок кода, выполняемого действия является следующее

if (!ModelState.IsValid) { 
    //Invalid - redisplay form with errors 
    return PartialView("IssueCodeGenerator", model); 
} 

и это результат я получаю во всех трех случаях

alt text

Почему код разметки кнопки исчезает?

Спасибо за помощь!

первый EDIT:

После проверки текстовое поле IssueCode потерять это только для чтения = "только для чтения" атрибут. Это означает, что первое условие не соответствует, я думаю ....

второй EDIT:

Согласно комментарию Дарин Я в том числе

  1. Действие, которое показать Частичный вид
  2. Экстракт частичного, который показывает, что переменная ModelState хранится в виде скрытого элемента управления внутри формы
  3. Действие контроллера, вызванное частичным
  4. JQuery код, который представит парциальное

1 - это действие, которое показывает частичный

[HttpGet] 
public ActionResult Create() 
{ 
    IssueModel im = new IssueModel() 
    { 
     ModelState = ModelStateEnum.Add, 
     FirmID = _firmManager.GetMyFirmID(), 
     CreatedDate = DateTime.Now, 
     LastUpdateDate = DateTime.Now, 
     HasCodeGenerator = _optionManager.HasIssueCodeGenerator() 
    }; 
    return PartialView("Issue", im); 
} 

2 - Экстракт частичной Issue.ascx

<% using (Html.BeginForm("SaveOrDelete", "Issue", FormMethod.Post, new { id = "crudForm" })) { %> 
    <%= Html.HiddenFor(model => model.FirmID) %> 
    <%= Html.HiddenFor(model => model.IssueID) %> 
    <%= Html.HiddenFor(model => model.ModelState) %> 

3 - Это действие контроллера, которое вызывается при отправке формы

[HttpPost] 
public ActionResult SaveOrDelete(IssueModel model) { 
    if (!ModelState.IsValid) { 
     //Invalid - redisplay form with errors 
     return PartialView("Issue", model); 
    } 

    try { 
     Issue i = null; 
     if (model.ModelState == ModelStateEnum.Add) 
      i = new Issue(); 
     else 
      i = _manager.FindIssueByIssueID(model.IssueID); 
     if (model.ModelState != ModelStateEnum.Delete) { 
      _manager.BindIssueModel(i, model); 
      if (model.ModelState == ModelStateEnum.Add) 
       i.FirmID = _contactManager.GetMyContact().FirmID; 
      i.LastUpdateDate = DateTime.Now; 
      _manager.SaveIssue(i); 
     } else { 
      _manager.DeleteIssue(i); 
     } 
     return PartialView("ActionCompleted"); 
    } 
    catch (Exception ex) { 
     return PartialView("ActionError", 
      new ActionErrorModel() { Message = ex.Message }); 
    } 
} 

4 - Это код JQuery, что отправить форму

$("#crudForm").submit(function(event) { 
    event.preventDefault(); 
    $("#crudForm").block(); 
    $.ajax({ 
     type: "post", 
     dataType: "html", 
     url: "/Issue/SaveOrDelete", 
     sync: true, 
     data: $("#crudForm").serialize(), 
     success: function(response) { 
      $("#crudForm").parent().html('').html(response); 
      $("#crudForm").unblock(); 
     }, 
     error: function(response) { 
      $("#crudForm").unblock(); 
     } 
    }); 
}); 

Надеется, что это поможет найти проблему. Спасибо.

ответ

0

Потому что Model.ModelState == ModelStateEnum.Add evals to false?

MVC не выключить кнопку HTML ...


Даже не видя формы его довольно ясно, что Дарин правильно и ваш ModelState перечисление становится установлено нулевое значение.

+0

@jfar: Нет. Это неправда. ModelState оценивает значение true, как и перед отправкой формы. Я просто отправляю обратно ту же модель, которую я получил. Я знаю, что MVC не выключит мою кнопку, но я подозреваю, что что-то происходит, когда происходит валидация ... – Lorenzo

+0

@jfar: точнее ... если я заставляю, что валидация не вернет ложное заполнение всех полей, которые у меня есть что мой код уровня данных выполняет ветвь «Вставить». Это означает, что Model.ModelState оценивает ModelStateEnum.Add .. – Lorenzo

+1

@Lorenzo, вместо объяснения всего этого, пожалуйста, покажите свой код контроллера, потому что более чем очевидно, что проблема здесь связана с тем, что ваши свойства модели неправильно заполнены и вы не входите в правильную ветку 'if'. Не думайте, что если вы вернете ту же модель в представление, как тот, который вы получили в качестве параметра для действия вашего контроллера, эта модель в порядке. Если у вас нет соответствующего поля в вашем представлении, чтобы установить, например, свойство 'ModelState', оно просто примет значение по умолчанию. –

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