У меня есть частичное представление, где я отображаю, если пользователь выбрал опцию, кнопку, которая позволяет пользователю автоматически генерировать значение для определенного поля. Пожалуйста, посмотрите на эту картинку, чтобы понять, что я имею в виду:
Это достигается с помощью следующей разметки в частичном представлении
<%= 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 () в конец поля ввода и ValidationSummary aut в конец представления.
Когда пользователь отправляет форму, первый блок кода, выполняемый действием, выглядит следующим образом
if ( !ModelState.IsValid ) {
//Invalid - redisplay form with errors
return PartialView( "IssueCodeGenerator", model );
}
и вот результат, который я получаю во всех трех случаях
Почему код разметки для кнопки исчезает?
Спасибо за помощь!
1-е РЕДАКТИРОВАНИЕ :
После проверки текстовое поле IssueCode теряет атрибут readonly = "readonly". Это означает, что первое условие не соответствует, я думаю ....
2-е РЕДАКТИРОВАНИЕ:
Согласно комментарию Дарина я включаю
- Действие, показывающее частичное представление
- Выдержка из партиала, показывающая, что переменная 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();
}
});
});
Надеюсь, что это поможет найти проблему. Спасибо.