У меня есть частичный вид, где я визуализую, если пользователь выбрал опцию, кнопку, которая позволяет пользователю автоматически генерировать значение для определенного поля. Пожалуйста, дайте взглянуть на эту картину, чтобы понять, что я имею в виду:Почему моя кнопка не отображается?
Это достигается с помощью следующей разметки на частичный вид
<%= 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);
}
и это результат я получаю во всех трех случаях
Почему код разметки кнопки исчезает?
Спасибо за помощь!
первый EDIT:
После проверки текстовое поле IssueCode потерять это только для чтения = "только для чтения" атрибут. Это означает, что первое условие не соответствует, я думаю ....
второй EDIT:
Согласно комментарию Дарин Я в том числе
- Действие, которое показать Частичный вид
- Экстракт частичного, который показывает, что переменная ModelState хранится в виде скрытого элемента управления внутри формы
- Действие контроллера, вызванное частичным
- 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();
}
});
});
Надеется, что это поможет найти проблему. Спасибо.
@jfar: Нет. Это неправда. ModelState оценивает значение true, как и перед отправкой формы. Я просто отправляю обратно ту же модель, которую я получил. Я знаю, что MVC не выключит мою кнопку, но я подозреваю, что что-то происходит, когда происходит валидация ... – Lorenzo
@jfar: точнее ... если я заставляю, что валидация не вернет ложное заполнение всех полей, которые у меня есть что мой код уровня данных выполняет ветвь «Вставить». Это означает, что Model.ModelState оценивает ModelStateEnum.Add .. – Lorenzo
@Lorenzo, вместо объяснения всего этого, пожалуйста, покажите свой код контроллера, потому что более чем очевидно, что проблема здесь связана с тем, что ваши свойства модели неправильно заполнены и вы не входите в правильную ветку 'if'. Не думайте, что если вы вернете ту же модель в представление, как тот, который вы получили в качестве параметра для действия вашего контроллера, эта модель в порядке. Если у вас нет соответствующего поля в вашем представлении, чтобы установить, например, свойство 'ModelState', оно просто примет значение по умолчанию. –