我正在使用 C# 和 ASP.NET MVC 开发一个小表单,在这个表单中我有一个 dropdownlist
它显示了一些启用状态,这取决于表单中出现的值,在本例中为 FINISHED。
我想在后端设置一些限制,以避免用户更改 disabled
的值从导航器的控制台,它不允许他发送它们,我真正需要的是在 Controller 中验证未发送此数据。
下面是代码dropdownlist
有不同的选择
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<select id="ticketStatusInput" name="status" class="form-control form-control-user" style="width: 100%; padding: 0.375rem 0.75rem; height: 50px;" tabindex="-1" aria-hidden="true">
<option value="" disabled="" selected="">Select a option</option>
<option value="ABT" disabled="">OPEN</option>
<option value="ASG">ASSIGNED</option>
<option value="CDO" disabled="">CLOSED</option>
<option value="ESU" disabled="">WAITING FOR USER</option>
<option value="PRC">IN PROCESS</option>
<option value="TMN">FINISHED</option>
</select>
状态ID为ABT对应OPEN状态,ASG对应ASSIGNED状态,CDO对应CLOSED状态,ESU,对应于USER WAITING状态,PRC对应于IN PROCESS状态,最后TMN对应于FINISHED状态。
这是加载数据的Javascript函数及其各自验证的实现,很明显TMN对应的是FINISHED状态。
function loadTicketDetails() {
$(".fixed-action-btn").floatingActionButton();
$(".fixed-action-btn").show("slow");
$('[data-toggle="tooltip"]').tooltip();
document.getElementById("modalAceptNew").style.display = "none";
const url = document.getElementById("allTicketData").value;
window.hasRun = true;
$.ajax({
url: url,
type: "POST",
dataType: "json",
success: function (data) {
$("#StatusDiv select").val(data.Status);
//Validation when FINISHED can be assigned to ASSIGNED/IN PROCESS
if (data.Status == 'TMN') {
$("#StatusDiv select option[value*='ABT']").prop("disabled", true);
$("#StatusDiv select option[value*='CDO']").prop("disabled", true);
$("#StatusDiv select option[value*='ESU']").prop("disabled", true);
}
},
error: function() {
alert("There was an error loading the data, please try again.");
}
});
}
最后是 Controller ,它应该在后面进行一些验证
[HttpPost]
public JsonResult UpdateTicketFromDetails()
{
var ticketStatusInput = Request.Form["ticketStatusInput"];
try
{
TicketRegisterResult result;
using (var scope = new TransactionScope())
{
// I create a new record variable with all fields
var record = new TK_DT_RECORDS
{
TK_CT_STATUS_ID = ticketStatusInput,
};
// We update the ticket data (this will always be done)
var model = new TicketRegisterModel();
// We create the new record in the record table and insert it
result = model.UpdateTicket;
//If the ticket was not saved, the transaction is finished and we return the error message
if (!result.Success)
return Json(new TicketResult
{
IsValid = false,
Error = "The changes could not be saved, please try again."
});
scope.Complete();
}
}catch (DbEntityValidationException ex)
{
//Failed to try to register data in the database
foreach (var e in ex.EntityValidationErrors)
foreach (var validationError in e.ValidationErrors)
Console.WriteLine("Property: " + validationError.PropertyName + " Error: " +
validationError.ErrorMessage);
return Json(new TicketResult
{
IsValid = false,
Error = "There was an error creating the ticket, please try again."
});
}
return Json(new TicketResult
{
IsValid = true
});
}
数据将始终被发送,因为我无法控制它。我需要的是一个允许控制数据是否有效的函数。
我找到了一篇关于 Controller 端数据验证的文章,但我一开始使用 C# 就不太清楚了
业务规则
我有一个下拉列表,其中值 OPEN、ASSIGNED、CLOSED、IS WAITING FOR USER、处理中、完成。
当FINISHED 值到达下拉列表时,它只能分配给ASSIGNED 或IN PROCESS 表示其他都被禁用。
更新:
我提出了异步函数的问题 <InputStatus>
最佳答案
您也可以使用此方法。
如果您想要更多验证,您也可以创建自定义验证。
您可以在数据库中获取所有禁用选项,然后检查是否要阻止静态数据压缩。
[HttpPost]
public JsonResult UpdateTicketFromDetails()
{
var ticketStatusInput = Request.Form["ticketStatusInput"];
var ticketStatusInput = Request.Form["ticketStatusInput"];
var oExcludeItem = new string[] { "ABT", "CDO", "ESU" }; // You can use string array also
if (!string.IsNullOrEmpty(ticketStatusInput))
{
if (oExcludeItem.Contains(ticketStatusInput))
{
return Json(new TicketResult
{
IsValid = false,
Error = "Please select only enable option";
});
}
}
else
{
return Json(new TicketResult
{
IsValid = false,
Error = "Please select valid data";
});
}
var lstDisableOption = new List<string>(); // You can also use with List object
lstDisableOption.Add("ABT");
lstDisableOption.Add("CDO");
lstDisableOption.Add("ESU");
if (!string.IsNullOrEmpty(ticketStatusInput))
{
if (lstDisableOption.Any(x => x == ticketStatusInput))
{
return Json(new TicketResult
{
IsValid = false,
Error = "Please select only enable option";
});
}
}
else
{
return Json(new TicketResult
{
IsValid = false,
Error = "Please select valid data";
});
}
}
try
{
TicketRegisterResult result;
using (var scope = new TransactionScope())
{
// I create a new record variable with all fields
var record = new TK_DT_RECORDS
{
TK_CT_STATUS_ID = ticketStatusInput,
};
// We update the ticket data (this will always be done)
var model = new TicketRegisterModel();
// We create the new record in the record table and insert it
result = model.UpdateTicket;
//If the ticket was not saved, the transaction is finished and we return the error message
if (!result.Success)
return Json(new TicketResult
{
IsValid = false,
Error = "The changes could not be saved, please try again."
});
scope.Complete();
}
}
catch (DbEntityValidationException ex)
{
//Failed to try to register data in the database
foreach (var e in ex.EntityValidationErrors)
foreach (var validationError in e.ValidationErrors)
Console.WriteLine("Property: " + validationError.PropertyName + " Error: " +
validationError.ErrorMessage);
return Json(new TicketResult
{
IsValid = false,
Error = "There was an error creating the ticket, please try again."
});
}
return Json(new TicketResult
{
IsValid = true
});
}
关于javascript - 如何创建函数以在后端验证下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58290695/